hi,
Probably many of U building .ebuild are tired of SKELL-ing .ebuilds manualy.. i.e.
create nececary directories, copy skel.ebuild to your portage-working dir, then delete
all the coments edit the file....etc..
so was I :") even i dont do ebuild so often... and below is a script to simplify this
process ..(It requires only perl and Curses::UI to work, File::Path is core module)..
What exactly the script does...
- reads the skel.ebuild file
- removes the comments and new lines
- shows a dialog where u fill the data about the ebuild, such as - ebuild name,
version, category, url, description and other details
- fill the values to the specified places..
- create the required directories if needed
- saving the ebuild file.
- license and category is specified trought select boxes
- the script is aware of PORTDIR_OVERLAY if specied in make.conf..
- New fields can be easly added - take a look at fillWidgets() sub.
- it needs some final touches by someone which understand better .ebuild construction..
- -regexp on ebuildVersion may need some refining
- shortcuts Ctrl-G for generation, Ctrl-X for exit
- fast selection/search inside select-boxes use this keysequence "->/"
Screenshot as attachment if allowed...
I'll be glad if someone add this as .ebuild to portage... or into some other package..
====================the mkebuild script==============================
#!/usr/bin/perl
#Created by : raptor
#
use strict;
use File::Path;
our $pDir = '/usr/portage';
our $myPDir = qx{grep '^\s*PORTDIR_OVERLAY=' /etc/make.conf};
chop $myPDir;
$myPDir =~ s/^.*PORTDIR_OVERLAY=//;
our $skel = "$pDir/skel.ebuild";
our $skelTxt = qx{grep -v '^.*#' $skel};#get the skel.ebuild & remove comments
our (%widgets, %w, $cui);
our %v = ( #build select box data
category => [ map { $_ =~ s!$pDir/(.+)$!$1!; $_} grep /-/, <$pDir/*> ],
licenses => [ map { $_ =~ s!$pDir/licenses/(.+)$!$1!; $_} <$pDir/licenses/*> ],
);
sub fillWidgets {
%widgets = (
category => { type => 'Popupmenu', order => 1, -values => $v{category}, -selected
=> 0 },
ebuildName => { -text => 'foobar', order => 2 },
ebuildVersion => { -text => '99.99-r99', order => 3, -regexp =>
'/\d\d?\.\d\d?-r\d\d?/' },
DESCRIPTION => { -text => '', order => 11 },
HOMEPAGE => { -text => 'http://', order => 12, -pos => 8 },
SRC_URI => { -text => 'ftp://foo.bar.com/${P}.tar.gz', order => 13 },
LICENSE => { type => 'Popupmenu', order => 14, -values => $v{licenses},-selected
=> 87 },
SLOT => { -text => '0', order => 15 },
KEYWORDS => { -text => '~x86', order => 16 },
IUSE => { -text => '', order => 17 },
DEPEND => { -text => '', order => 18 },
S => { -text => '${WORKDIR}/${P}', order => 19, -pos => 16 },
)
}
sub check {
if ( ! $w{ebuildVersion}{-text} || $w{ebuildVersion}{-text} eq
$widgets{ebuildVersion}{-text}) {
$cui->error('Pls specify .ebuild version. Ex: 1.0-r1');
$w{ebuildVersion}->focus; return
}
if ( ! $w{ebuildName}{-text} || $w{ebuildName}{-text} eq
$widgets{ebuildName}{-text}) {
$cui->error('Pls specify .ebuild name'); $w{ebuildName}->focus; return
}
unless ($w{category}{-selected}) {
$cui->error('Pls specify category'); $w{category}->focus; return
}
return 1
}
sub generate {
for my $k (sort {$widgets{$w{$a}->userdata}{order} <=>
$widgets{$w{$b}->userdata}{order} } keys %w) {
my $val;
unless ($widgets{$k}{type}) {#edit box
$val = $w{$k}{-text};
} else {#select-box
$val = $widgets{$k}{values}[$w{$k}{-selected}];
}
if ($val) { $skelTxt =~ s/$k="(.*)"/$k="$val"/ }#fill the value
else { $skelTxt =~ s/$k="(.*)"// }#if no value wipe
}
$skelTxt =~ s/\n{1,}/\n/gm;#wipe out all empty lines
my $cat = $widgets{category}{-values}[$w{category}{-selected}];;
my $ebuild = ($myPDir || $pDir) . "/$cat/$w{ebuildName}{-text}";
mkpath $ebuild;
$ebuild .= "/$w{ebuildName}{-text}-$w{ebuildVersion}{-text}.ebuild";
$cui->dialog("Ebuild generated in :\n$ebuild");
open FILE, ">$ebuild" or die print "oops :$!\n";
print FILE $skelTxt;
close FILE;
}
sub ok{
return unless check;
generate;
exit
}
sub cancel {
exit
}
#===================main==================
#rint $skelTxt;
use Curses::UI;
fillWidgets;
$cui = new Curses::UI;
my $win = $cui->add( 'win', 'Window', -title => 'Make ebuild', -pad => 2, -border =>
1, -vscrollbar => 'right');
my $btn = $win->add( 'buttons', 'Buttonbox', -x => 2, -y => -2,
-buttons => [
{ -label => '[Generate]', -value => '1', -onpress => \&ok, -shortcut => 'g' },
{ -label => '[Exit]', -value => '0', -onpress => \&cancel, -shortcut => 'x' }
]
);
my ($i, $y);
my $x = 1;
for my $w (sort {$widgets{$a}{order} <=> $widgets{$b}{order} } keys %widgets) {
if ($y == 7) {$x += 45; $y = 0};
my $type = $widgets{$w}{type} || 'TextEntry';
my $title = $widgets{$w}{title} || $w;
$w{$w} = $win->add( $w, $type, -x => $x, -y => $y*3 ,
-border => 1, -width => 40, -userdata => $w, -title => $title,
(map { $_ => $widgets{$w}{$_} } grep /^-/, keys %{$widgets{$w}})
);
$i++; $y++;
};
$cui->set_binding(\&cancel,"\cx");
$cui->set_binding(\&ok,"\cg");
$w{category}->focus;
$cui->MainLoop;
--
[EMAIL PROTECTED] mailing list