diff --git a/cpan2rpm/cpan2rpm b/cpan2rpm/cpan2rpm index 28e8b01..a378920 100755 --- a/cpan2rpm/cpan2rpm +++ b/cpan2rpm/cpan2rpm @@ -3,6 +3,7 @@ # # cpan2rpm - CPAN module RPM maker # Copyright (C) 2001-2003 Erick Calder +# Modified by Vitaly Lipatov , 2005, 2008 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -78,11 +79,13 @@ sub init { %info = ( url => "http://www.cpan.org", packager => "Arix International ", - group => "Applications/CPAN", + group => "Development/Perl", license => "Artistic", - release => 1, + author => "unknown", + release => "alt1", buildroot => "%{_tmppath}/%{name}-%{version}-%(id -u -n)", defattr => "-,root,root", + "rpm-args" => "", ); my %desc = ( @@ -119,6 +122,7 @@ sub init { # -- build options "spec-only" => "only generates spec file", "spec=s" => "specifies the name of a spec file", + "rpm-args=s" => "additional rpm arguments", "make-maker=s" => "arguments for makefile creation", "make=s" => "arguments passed to make", "make-no-test" => "suppress running test suite", @@ -196,6 +200,7 @@ sub init { exit; } + if (defined $info{"sign-setup"}) { sign_setup(); exit; @@ -219,6 +224,10 @@ sub init { ); }; + # Default behavior + $info{"spec-only"} = "1"; + $info{"no-upgrade-chk"} = "1"; + upgrade() if defined $info{upgrade}; unless ($info{"no-sign"}) { @@ -230,6 +239,9 @@ sub init { # deal with newer versions chkupgrade(); + # set packager + $info{packager} = getrpm_macdef("packager"); + # check directory permissions $RPMDIR{BUILD} = getrpm_macdef("_builddir"); @@ -241,7 +253,7 @@ sub init { chkdirs(); # sets empty string if not --buildarch and --spec-only - $info{buildarch} ||= $info{"spec-only"} ? "" : $RPMDIR{ARCH}; + $info{BuildArch} ||= $info{"spec-only"} ? "" : $RPMDIR{ARCH}; # set module download method @@ -384,7 +396,7 @@ sub get_meta { else { my $xs = 0; find(sub { $xs = 1 if /\.(xs|c)$/i }, $info->{evaldir}); - $info->{buildarch} = "noarch" if $xs == 0; + $info->{BuildArch} = "noarch" if $xs == 0; } chdir $info->{evaldir} || die "get_meta(): $!"; @@ -578,7 +590,7 @@ sub get_meta { chkdirs(); - $info->{spec} ||= "$RPMDIR{SPECS}/$info->{name}.spec"; + $info->{spec} ||= "$RPMDIR{SPECS}/perl-$info->{name}.spec"; ($info->{tardir} = $info->{evaldir}) =~ s|.*/||; # for directories, guess some of the needed values @@ -619,11 +631,10 @@ EOF # assemble other info - $info->{summary} = "$info->{name} - " . ($meta{ABSTRACT} || "Perl module"); + $info->{summary} = ($meta{ABSTRACT} || "$info->{name} - " . "Perl module"); $info->{description} ||= $meta{DESCRIPTION} || "None."; push @{$info->{source}}, $info->{tarball} unless $info->{source}; - $info->{changelog} = changelog(); $info->{"find-provides"} &&= qq/%define __find_provides $info->{"find-provides"}/; @@ -635,9 +646,9 @@ EOF # option lists $info->{"opts-simple"} = [qw/ - name summary version release epoch - vendor packager distribution license group url - buildroot buildarch + name version release = summary = epoch + license group url vendor = packager = distribution + BuildArch /]; $info->{"opts-agg"} = [qw/ @@ -742,6 +753,7 @@ EOF sub mk_spec { my $info = shift || $_; local $_; + my $pkgname = $info->{name}; print "Generating spec file\n"; @@ -756,15 +768,14 @@ sub mk_spec { $info->{$_} =~ s/\r//g for keys %info; # generalise whenever possible - - for (qw/tardir source/) { - $info->{$_} =~ s/$info->{name}/%{pkgname}/; - $info->{$_} =~ s/$info->{version}/%{version}/; + for (qw/tardir source source-list/) { + $info->{$_} =~ s/$pkgname/%m_distro/; + $info->{$_} =~ s/$info->{version}/%version/; } $info->{description} =~ s/\s+$//; - $info->{maketest} = $info->{"make-no-test"} ? 0 : 1; - $info->{vendor} = $info->{author}; + $info->{maketest} = $info->{"make-no-test"} ? "_disable_test 1" : "_enable_test 1"; + #$info->{vendor} = $info->{author}; if ($info->{name} eq "ExtUtils-MakeMaker") { # MakeMaker builds itself using itself @@ -809,27 +820,26 @@ sub mk_spec { # prepend string to separate module from usual namespace - my $pkgname = $info->{name}; $info->{name} = "perl-" . $info->{name} unless $info->{"no-prfx"}; my $spec = <{module} - # This spec file was automatically generated by cpan2rpm [ver: $VERSION] + # (ALT Linux revision) ZZ my $me; ($me = $0) =~ s|.*/||; $spec .= <{module} eq $me; # The following arguments were used: # $ARGS -ZZ - $spec .= <{maketest} + %define module $pkgname + %define m_distro $pkgname + %define m_name $info->{module} + %define m_author_id $info->{author} + %define $info->{maketest} ZZ $spec .= <{"define-list"}; # user definitions @@ -848,11 +858,12 @@ ZZ $spec .= "\n"; for (@{$info->{"opts-simple"}}) { - $spec .= sprintf("%-*s %s\n", $SPECCOL, "$_:", $info->{$_}) + $spec .= "\n" if ($_ eq "="); + $spec .= sprintf("%-*s %s\n", $SPECCOL, ucfirst("$_:"), $info->{$_}) if $info->{$_}; } - $spec .= sprintf("%-*s %s\n", $SPECCOL, "prefix:", "%(echo %{_prefix})"); + #$spec .= sprintf("%-*s %s\n", $SPECCOL, "prefix:", "%(echo %{_prefix})"); # add lists @@ -865,133 +876,44 @@ ZZ $spec .= "\n" . q/%description/ . "\n$info->{description}\n"; - $_ = <{'patch-apply'} if $info->{"patch-apply"}; - $_ .= $/ . "chmod -R u+w %{_builddir}/$info->{tardir}" . $/; + #$_ .= $/ . "chmod -R u+w %{_builddir}/$info->{tardir}" . $/; + $spec .= "\n"; $spec .= mksec($info, "prep" => $_); - $_ = ($info->{PL} =~ /^Make/) - ? qq/ - $info->{fixin} - CFLAGS="\$RPM_OPT_FLAGS" - %{__perl} Makefile.PL $info->{"make-maker"} - %{__make} $info->{"make"} - %if %maketest - %{__make} test - %endif - / : qq/ - $info->{fixin} - %{__perl} Build.PL - %{__perl} Build - %if %maketest - %{__perl} Build test - %endif - /; - s/^\s+//mg; - $spec .= mksec($info, "build" => $_); - - my $install = ($info->{PL} =~ /^Make/) - ? qq/%{makeinstall} / - : qq/%{__perl} Build install / - ; - $install .= $info->{"make-install"}; - - $_ = <{"no-requires"}{"install"} - $install - - cmd=/usr/share/spec-helper/compress_files - [ -x \$cmd ] || cmd=/usr/lib/rpm/brp-compress - [ -x \$cmd ] && \$cmd - - # SuSE Linux - if [ -e /etc/SuSE-release -o -e /etc/UnitedLinux-release ] - then - %{__mkdir_p} %{buildroot}/var/adm/perl-modules - %{__cat} `find %{buildroot} -name "perllocal.pod"` \\ - | %{__sed} -e s+%{buildroot}++g \\ - > %{buildroot}/var/adm/perl-modules/%{name} - fi - - # remove special files - find %{buildroot} -name "perllocal.pod" \\ - -o -name ".packlist" \\ - -o -name "*.bs" \\ - |xargs -i rm -f {} - - # no empty directories - find %{buildroot}%{_prefix} \\ - -type d -depth \\ - -exec rmdir {} \\; 2>/dev/null - - %{__perl} -MFile::Find -le ' - find({ wanted => \\&wanted, no_chdir => 1}, "%{buildroot}"); - print "$info->{doc}"; - for my \$x (sort \@dirs, \@files) { - push \@ret, \$x unless indirs(\$x); - } - print join "\\n", sort \@ret; - - sub wanted { - return if /auto\$/; - - local \$_ = \$File::Find::name; - my \$f = \$_; s|^\\Q%{buildroot}\\E||; - return unless length; - return \$files[\@files] = \$_ if -f \$f; - - \$d = \$_; - /\\Q\$d\\E/ && return for reverse sort \@INC; - \$d =~ /\\Q\$_\\E/ && return - for qw|/etc %_prefix/man %_prefix/bin %_prefix/share|; - - \$dirs[\@dirs] = \$_; - } + $spec .= "\n"; + $spec .= < %filelist +%install +%perl_vendor_install - [ -z %filelist ] && { - echo "ERROR: empty %files listing" - exit -1 - } +%files ZZ - s/^ {8}//mg; - $spec .= mksec($info, "install" => $_); - - $_ = qq|[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}\n|; - # $_ .= qq|rm -rf %_builddir/%name-%version\n|; - $_ .= qq/$info->{"no-requires"}{"clean"}\n/ - if $info->{"no-requires"}{"clean"}; - $spec .= mksec($info, "clean" => $_); - - $spec .= qq|$/%files -f %filelist|; - $spec .= qq|$/%defattr($info->{defattr})$/|; - $spec .= $info->{epilogue}{files}; - - $spec .= mksec($info, "changelog" - => "* $info->{changelog}\n- Initial build." - ); - + my $bn; ($bn = $info->{module}) =~ s!(?:-|::).*!!; + + if ($info->{BuildArch} =~ /noarch/) { + $spec .= <{spec}, $spec); + print("SPEC: $info->{spec}\n"); + system("cleanup_spec $info->{spec}"); + system("buildreq --args=\"$info{'rpm-args'}\" $info->{spec}"); + system("add_changelog -e '- initial build for ALT Linux Sisyphus' $info->{spec}"); exit if $info->{"spec-only"}; } @@ -1013,11 +935,11 @@ sub mk_rpm { } $info->{rpm} = sprintf("%s/%s-%s-%s.%s.rpm" - , "$RPMDIR{RPMS}/$info->{buildarch}" + , "$RPMDIR{RPMS}/$info->{BuildArch}" , $info->{name} , $info->{version} , $info->{release} - , $info->{buildarch} + , $info->{BuildArch} ); $info->{srpm} = sprintf("%s/%s-%s-%s.src.rpm" , $RPMDIR{SRPMS} @@ -1030,19 +952,19 @@ sub mk_rpm { if (! -r $info->{rpm} || $info->{force}) { print "Generating package\n"; - my $bp = qx/$RPM -bp $info->{spec} 2>&1/; - warn("RPM test unpacking failed! [$RPM -bp $info->{spec}]\n$bp") + my $bp = qx/$RPM $info{"rpm-args"} -bp $info->{spec} 2>&1/; + warn("RPM test unpacking failed! [$RPM $info{'rpm-args'} -bp $info->{spec}]\n$bp") if $ret = $? >> 8; if ($ret == 0) { - my @cmd = ($RPM, '-ba'); + my @cmd = ($RPM, $info{"rpm-args"}, '-ba'); push @cmd, "--clean" unless $info->{"no-clean"}; push @cmd, $info->{sign} if $info->{sign}; push @cmd, $info->{spec}; debug(join " ", @cmd); print "Signing package (pass phrase required)\n" if $info->{sign}; - system(@cmd); + system(join(" ", @cmd)); die "RPM build failed [$ret]" if $ret = $? >> 8; } } @@ -1479,7 +1401,7 @@ sub mk_rpm_dirs { BUILD SOURCES SPECS SRPMS RPMS RPMS/i386 RPMS/i686 RPMS/noarch |; - push @subdirs, "RPMS/$info{buildarch}" if $info{buildarch}; + push @subdirs, "RPMS/$info{BuildArch}" if $info{BuildArch}; for (map "$topdir/$_", "", @subdirs) { next if -e; mkdir($_, 0755) || die "Cannot make $_: $!"; @@ -1554,7 +1476,7 @@ sub optagg { my $nm = shift || $_; my @opt; push @opt, split /,/ for @{$info->{$nm}}; my $ret = ""; - $ret .= sprintf("%-*s %s\n", $SPECCOL, "$nm:", $_) for @opt; + $ret .= sprintf("%-*s %s\n", $SPECCOL, ucfirst("$nm:"), $_) for @opt; $ret; } @@ -1569,7 +1491,7 @@ sub getrpm_ver { sub getrpm_macdef($) { my $key = shift; - chomp(local $_ = qx/rpm --eval \%{$key}/); + chomp(local $_ = qx/rpm $info{"rpm-args"} --eval \%{$key}/); s/^\s+//; s/\s*\n+/ /gs; s/\s+$//; $_; } @@ -1629,7 +1551,7 @@ sub upgrade { } my ($f) = $url =~ m|.*/(.*)|; - my @ret = qx|$RPM -ta $TMPDIR/$f 2>&1|; + my @ret = qx|$RPM $info{"rpm-args"} -ta $TMPDIR/$f 2>&1|; die "upgrade(): $!" if $?; /Wrote:\s+(.*)$/ && ($info{rpm} = $1) && last for reverse @ret; inst_rpm(\%info); @@ -1641,13 +1563,12 @@ sub changelog { my @mon = ("Jan", "Feb", "Mar", "Apr", "May", "Jun" , "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ); - - return sprintf("%s %s %d %d %s" + return sprintf("%s %s %02d %d %s" , $dow[(localtime)[6]] , $mon[(localtime)[4]] , (localtime)[3] , 1900 + (localtime)[5] - , sprintf("%s\@%s", (getpwuid($<))[0], hostname()) + , sprintf("%s %s-%s", $info{packager}, $info{version}, $info{release}) ); }