194 lines
3.6 KiB
Perl
194 lines
3.6 KiB
Perl
package RPM::Specfile;
|
|
|
|
use POSIX;
|
|
|
|
use strict;
|
|
|
|
use vars qw/$VERSION/;
|
|
|
|
$VERSION = '1.02';
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
|
|
my $self = bless { }, $class;
|
|
|
|
return $self;
|
|
}
|
|
|
|
my @simple_accessors = qw/name version release epoch license group url description prep build clean install summary buildroot buildrequires file_param packager vendor distribution buildarch/;
|
|
|
|
foreach my $field (@simple_accessors) {
|
|
my $sub = q {
|
|
sub RPM::Specfile::[[field]] {
|
|
my $self = shift;
|
|
if (@_) {
|
|
my $value = shift;
|
|
$self->{__[[field]]__} = $value;
|
|
}
|
|
return $self->{__[[field]]__};
|
|
}
|
|
};
|
|
|
|
$sub =~ s/\[\[field\]\]/$field/g;
|
|
eval $sub;
|
|
|
|
if ($@) {
|
|
die $@;
|
|
}
|
|
}
|
|
|
|
my @array_accessors = qw/source patch changelog provide require file/;
|
|
|
|
foreach my $field (@array_accessors) {
|
|
my $sub = q {
|
|
sub RPM::Specfile::[[field]] {
|
|
my $self = shift;
|
|
$self->{__[[field]]__} ||= [ ];
|
|
|
|
if (@_) {
|
|
my $index = shift;
|
|
if (@_) {
|
|
my $value = shift;
|
|
$self->{__[[field]]__}->[$index] = $value;
|
|
}
|
|
return $self->{__[[field]]__}->[$index];
|
|
}
|
|
else {
|
|
return @{$self->{__[[field]]__}};
|
|
}
|
|
}
|
|
|
|
sub RPM::Specfile::push_[[field]] {
|
|
my $self = shift;
|
|
my $entry = shift;
|
|
|
|
$self->{__[[field]]__} ||= [ ];
|
|
push @{$self->{__[[field]]__}}, $entry;
|
|
}
|
|
|
|
sub RPM::Specfile::clear_[[field]] {
|
|
my $self = shift;
|
|
my $entry = shift;
|
|
|
|
$self->{__[[field]]__} = [ ];
|
|
}
|
|
|
|
};
|
|
|
|
$sub =~ s/\[\[field\]\]/$field/g;
|
|
eval $sub;
|
|
|
|
if ($@) {
|
|
die $@;
|
|
}
|
|
}
|
|
|
|
sub add_changelog_entry {
|
|
my $self = shift;
|
|
my $who = shift;
|
|
my $entry = shift;
|
|
|
|
my $output;
|
|
$output .= strftime("* %a %b %d %Y $who\n", localtime time);
|
|
$output .= "- $entry\n";
|
|
|
|
$self->push_changelog($output);
|
|
}
|
|
|
|
sub generate_specfile {
|
|
my $self = shift;
|
|
|
|
my $output;
|
|
|
|
my %defaults = ( buildroot => "%{_tmppath}/%{name}-root" );
|
|
$self->$_($self->$_() || $defaults{$_}) foreach keys %defaults;
|
|
|
|
my %proper_names = ( url => "URL", buildroot => "BuildRoot", "buildrequires" => "BuildRequires" );
|
|
|
|
foreach my $tag (qw/name version release epoch packager vendor distribution summary license group url buildroot buildrequires buildarch/) {
|
|
my $proper = $proper_names{$tag} || ucfirst $tag;
|
|
|
|
next unless defined $self->$tag();
|
|
$output .= "$proper: " . $self->$tag() . "\n";
|
|
}
|
|
|
|
my @reqs = $self->require;
|
|
for my $i (0 .. $#reqs) {
|
|
$output .= "Requires: $reqs[$i]\n";
|
|
}
|
|
|
|
my @sources = $self->source;
|
|
for my $i (0 .. $#sources) {
|
|
$output .= "Source$i: $sources[$i]\n";
|
|
}
|
|
|
|
my @patches = $self->patch;
|
|
for my $i (0 .. $#patches) {
|
|
$output .= "Patch$i: $patches[$i]\n";
|
|
}
|
|
|
|
$output .= "\n";
|
|
|
|
foreach my $sect (qw/description prep build clean install/) {
|
|
$output .= "%$sect\n";
|
|
$output .= $self->$sect() . "\n";
|
|
}
|
|
|
|
if ($self->file_param) {
|
|
$output .= "%files " . $self->file_param . "\n";
|
|
}
|
|
else {
|
|
$output .= "%files\n";
|
|
}
|
|
$output .= "$_\n" foreach $self->file;
|
|
|
|
$output .= "\n%changelog\n";
|
|
$output .= "$_\n" foreach $self->changelog;
|
|
|
|
return $output;
|
|
}
|
|
|
|
sub write_specfile {
|
|
my $self = shift;
|
|
my $dest = shift;
|
|
|
|
open FH, ">$dest"
|
|
or die "Can't open $dest: $!";
|
|
|
|
print FH $self->generate_specfile;
|
|
|
|
close FH;
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|
|
# Below is stub documentation for your module. You better edit it!
|
|
|
|
=head1 NAME
|
|
|
|
RPM::Specfile - Perl extension for creating RPM Specfiles
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use RPM::Specfile;
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Simple module for creation of RPM Spec files
|
|
|
|
=head2 EXPORT
|
|
|
|
None by default.
|
|
|
|
=head1 AUTHOR
|
|
|
|
Chip Turner <cturner@redhat.com>
|
|
|
|
=head1 SEE ALSO
|
|
|
|
L<perl>.
|
|
|
|
=cut
|