Skip to content

Commit 5a3be7c

Browse files
committed
Add support for pre_script and post_script, executed before and after the build
Also add support for package major/minor syntax and verbose option
1 parent 6fbd3f4 commit 5a3be7c

File tree

1 file changed

+98
-71
lines changed

1 file changed

+98
-71
lines changed

builder

Lines changed: 98 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ my $remote_portdir = $ENV{REMOTE_PORTDIR};
4444
my $pretend = $ENV{PRETEND} // 0;
4545
my $obsoleted = $ENV{DETECT_OBSOLETE} // 0;
4646
my $target_overlay = $ENV{TARGET_OVERLAY};
47+
my $verbose = $ENV{BUILDER_VERBOSE} // 0;
4748

4849
my $make_conf = $ENV{MAKE_CONF};
4950

@@ -67,11 +68,16 @@ sub say { print join( "\n", @_ ) . "\n"; }
6768

6869
sub safe_call {
6970
my $cmd = shift;
70-
my $rt = system($cmd);
71+
my $rt = _system($cmd);
7172
my $return = $rt >> 8;
7273
exit($return) if ($rt);
7374
}
7475

76+
sub _system {
77+
say "Executing: @_" if $verbose;
78+
return system(@_);
79+
}
80+
7581
sub append_to_file {
7682
my ( $file_name, $package ) = @_;
7783

@@ -92,7 +98,9 @@ sub append_to_file {
9298
close $fh_a;
9399
}
94100

95-
sub parse_overlays { map{ $_ =~ s/.*?\:\://g; $_ } @{ dclone(\@_) }; }
101+
sub parse_overlays {
102+
map { $_ =~ s/.*?\:\://g; $_ } grep {/\:\:/} @{ dclone( \@_ ) };
103+
}
96104

97105
sub add_portage_repository {
98106
my $repo = $_[0];
@@ -113,7 +121,7 @@ sub add_portage_repository {
113121
}
114122
$reponame = ( split( /\//, $repo ) )[-1] if !$reponame;
115123
$reponame =~ s/\.|//g; #clean
116-
system("mkdir -p /etc/portage/repos.conf/")
124+
_system("mkdir -p /etc/portage/repos.conf/")
117125
if ( !-d "/etc/portage/repos.conf/" );
118126

119127
say "==== Adding $reponame ====";
@@ -125,7 +133,7 @@ sync-uri = $repo
125133
auto-sync = yes' > /etc/portage/repos.conf/$reponame.conf
126134
}; # Declaring the repo and giving priority
127135

128-
system("emaint sync -r $reponame");
136+
_system("emaint sync -r $reponame");
129137
}
130138

131139
# Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output)
@@ -140,8 +148,9 @@ sub package_deps {
140148
$cache_key = "${package}:${depth}:${atom}";
141149

142150
if ( !exists $package_dep_cache{$cache_key} ) {
151+
my $local_p = to_abs_atom($package);
143152
my @dependencies =
144-
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
153+
qx/equery -C -q g --depth=$depth $local_p/; #depth=0 it's all
145154
chomp @dependencies;
146155

147156
# If an unversioned atom is given, equery returns results for all versions in the portage tree
@@ -151,7 +160,7 @@ sub package_deps {
151160
@dependencies = uniq(
152161
sort
153162
grep {$_}
154-
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
163+
map { $_ =~ s/\[.*\]|\s//g; &abs_atom($_) if $atom; $_ }
155164
@dependencies
156165
);
157166

@@ -232,9 +241,18 @@ sub calculate_missing {
232241
# Output: atom form (sys-fs/foobarfs)
233242
sub atom { s/-[0-9]{1,}.*$//; }
234243

244+
sub abs_atom { atom; s/^(\<|\>|=)+// }
245+
235246
# Same again as a function
236247
sub to_atom { my $p = shift; $p =~ s/-[0-9]{1,}.*$//; return $p; }
237248

249+
sub to_abs_atom {
250+
my $p = shift;
251+
$p = to_atom($p);
252+
$p =~ s/^(\<|\>|=)+//;
253+
return $p;
254+
}
255+
238256
# Input: Array
239257
# Output: array with unique elements
240258
sub uniq {
@@ -272,20 +290,20 @@ sub compile_packs {
272290
say "USEFLAGS: "
273291
. join( " ",
274292
@{ $per_package_useflags->{$target}->[$package_counter] } );
275-
$tmp_rt = system(
293+
$tmp_rt = _system(
276294
"USE=\""
277295
. join(
278296
" ",
279297
@{ $per_package_useflags->{$target}->[$package_counter]
280298
}
281299
)
282-
. "\" emerge $emerge_defaults_args -j $jobs $extra_arg $pack"
300+
. "\" emerge $emerge_defaults_args -j $jobs $extra_arg '$pack'"
283301
);
284302
}
285303
else {
286304
$tmp_rt =
287-
system(
288-
"emerge $emerge_defaults_args -j $jobs $extra_arg $pack");
305+
_system(
306+
"emerge $emerge_defaults_args -j $jobs $extra_arg '$pack'");
289307
}
290308
$package_counter++;
291309

@@ -310,13 +328,15 @@ sub help {
310328
say "****************************************************";
311329

312330
my $per_package_useflags;
313-
my @packages = @ARGV;
314-
my @injected_packages = $build_injected_args ? split( / /, $build_injected_args ) : ();
315-
my @parsed_overlays = grep { $_ !~ /gentoo/i } parse_overlays(@packages,@injected_packages);
331+
my @packages = @ARGV;
332+
my @injected_packages =
333+
$build_injected_args ? split( / /, $build_injected_args ) : ();
334+
my @parsed_overlays =
335+
grep { $_ !~ /gentoo/i } parse_overlays( @packages, @injected_packages );
316336

317337
say "Detected overlays: @parsed_overlays" if @parsed_overlays;
318338

319-
@overlays = uniq(@overlays,@parsed_overlays);
339+
@overlays = uniq( @overlays, @parsed_overlays );
320340

321341
if ( @overlays > 0 ) {
322342
say "Overlay(s) to add";
@@ -344,39 +364,39 @@ system("echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen"); #be sure about that.
344364

345365
# If defined, fetch a remote /etc/portage
346366
if ( $remote_conf_portdir ne "" ) {
347-
system("rm -rf /etc/portage");
348-
system("git clone $remote_conf_portdir /etc/portage");
349-
system("chown -R portage:portage /etc/portage");
350-
system("chmod -R ug+w,a+rX /etc/portage");
367+
_system("rm -rf /etc/portage");
368+
_system("git clone $remote_conf_portdir /etc/portage");
369+
_system("chown -R portage:portage /etc/portage");
370+
_system("chmod -R ug+w,a+rX /etc/portage");
351371
}
352372
else {
353-
system("cd /etc/portage/;git checkout master; git stash; git pull");
373+
_system("cd /etc/portage/;git checkout master; git stash; git pull");
354374
}
355375

356376
# If defined, fetch a remote /usr/portage
357377
if ( $remote_portdir ne "" ) {
358-
system("rm -rf /usr/portage");
359-
system("git clone $remote_portdir /usr/portage");
360-
system("chown -R portage:portage /usr/portage");
361-
system("chmod -R ug+w,a+rX /usr/portage");
378+
_system("rm -rf /usr/portage");
379+
_system("git clone $remote_portdir /usr/portage");
380+
_system("chown -R portage:portage /usr/portage");
381+
_system("chmod -R ug+w,a+rX /usr/portage");
362382
}
363-
system("mkdir /var/lib/layman") if ( !-d "/var/lib/layman" );
364-
system("touch /var/lib/layman/make.conf && layman-updater -R")
383+
_system("mkdir /var/lib/layman") if ( !-d "/var/lib/layman" );
384+
_system("touch /var/lib/layman/make.conf && layman-updater -R")
365385
if ( !-e "/var/lib/layman/make.conf" );
366386

367-
system("echo 'y' | layman -f -a $_") for @overlays;
387+
_system("echo 'y' | layman -f -a $_") for @overlays;
368388

369389
my $reponame = "LocalOverlay";
370390

371391
# Setting up a local overlay if doesn't exists
372-
system(
392+
_system(
373393
"rm -rf /usr/local/portage;cp -rf /usr/local/local_portage /usr/local/portage"
374394
) if ( -d "/usr/local/local_portage" );
375395

376396
if ( !-f "/usr/local/portage/profiles/repo_name" ) {
377-
system("mkdir -p /usr/local/portage/{metadata,profiles}");
378-
system("echo 'LocalOverlay' > /usr/local/portage/profiles/repo_name");
379-
system(
397+
_system("mkdir -p /usr/local/portage/{metadata,profiles}");
398+
_system("echo 'LocalOverlay' > /usr/local/portage/profiles/repo_name");
399+
_system(
380400
"echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf");
381401
}
382402
else {
@@ -386,8 +406,8 @@ else {
386406
chomp(@FILE);
387407
$reponame = $FILE[0];
388408
}
389-
system("chown -R portage:portage /usr/local/portage");
390-
system("chmod -R 755 /usr/local/portage");
409+
_system("chown -R portage:portage /usr/local/portage");
410+
_system("chmod -R 755 /usr/local/portage");
391411

392412
qx{
393413
echo '[$reponame]
@@ -404,48 +424,48 @@ if ( $remote_overlay and $remote_overlay ne "" ) {
404424
if ( $remove_layman_overlay and $remove_layman_overlay ne "" ) {
405425
say "===== Removing overlays: $remove_remote_overlay =====";
406426

407-
system("layman -d $_") for ( split( / /, $remove_layman_overlay ) );
427+
_system("layman -d $_") for ( split( / /, $remove_layman_overlay ) );
408428
}
409429
if ( $remove_remote_overlay and $remove_remote_overlay ne "" ) {
410430
say "===== Removing overlays: $remove_remote_overlay =====";
411-
system( "rm -rfv /etc/portage/" . $_ . ".conf" )
431+
_system( "rm -rfv /etc/portage/" . $_ . ".conf" )
412432
for ( split( / /, $remote_overlay ) );
413433
}
414434

415-
system("mkdir -p /usr/portage/distfiles/git3-src");
435+
_system("mkdir -p /usr/portage/distfiles/git3-src");
416436

417437
unless ( $skip_portage_sync == 1 ) {
418438

419439
# sync portage and overlays
420-
system("layman -S");
440+
_system("layman -S");
421441
if ( $webrsync == 1 ) {
422-
system("emerge-webrsync");
442+
_system("emerge-webrsync");
423443
}
424444
else {
425-
system("emerge --sync");
445+
_system("emerge --sync");
426446
}
427447
}
428448

429449
# preparing for MOAR automation
430-
say "Setting new profile to $profile" if defined $profile;
431-
qx|eselect profile set $profile| if defined $profile;
432-
system("eselect profile list") if defined $profile;
450+
say "Setting new profile to $profile" if defined $profile;
451+
_system("eselect profile set $profile") if defined $profile;
452+
_system("eselect profile list") if defined $profile;
433453

434454
if ( $use_equo && $entropy_repository eq "weekly" ) {
435-
qx|equo repo disable sabayonlinux.org|;
436-
qx|equo repo enable sabayon-weekly|;
455+
_system("equo repo disable sabayonlinux.org");
456+
_system("equo repo enable sabayon-weekly");
437457
}
438458
elsif ( $use_equo && $entropy_repository eq "testing" ) {
439-
qx|equo repo disable sabayon-weekly|;
440-
qx|equo repo enable sabayonlinux.org|;
441-
qx|equo repo enable sabayon-limbo|;
459+
_system("equo repo disable sabayon-weekly");
460+
_system("equo repo enable sabayonlinux.org");
461+
_system("equo repo enable sabayon-limbo");
442462
}
443463

444464
if ($use_equo) {
445465

446466
say "Devkit version:";
447-
system("equo s -vq app-misc/sabayon-devkit");
448-
467+
_system("equo s -vq app-misc/sabayon-devkit");
468+
_system("enman list --installed -q");
449469
my $enman_list_output = qx|enman list --installed -q|;
450470
chomp($enman_list_output);
451471
my @installed_enman_repos = split( /\n/, $enman_list_output );
@@ -468,19 +488,19 @@ if ($use_equo) {
468488
}
469489
}
470490

471-
system("enman add $repository_name")
491+
_system("enman add $repository_name")
472492
if ($enman_add_self
473493
and $repository_name
474494
and $repository_name ne "" );
475-
system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
476-
system("equo up && equo u");
495+
_system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
496+
_system("equo up && equo u");
477497
}
478498

479-
system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
499+
_system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
480500

481-
if( @injected_packages ) {
482-
say "[*] Injected installs:";
483-
say "\t* " . $_ for @injected_packages;
501+
if (@injected_packages) {
502+
say "[*] Injected installs:";
503+
say "\t* " . $_ for @injected_packages;
484504
}
485505

486506
# Allow users to specify atoms as: media-tv/kodi[-alsa,avahi]
@@ -538,72 +558,79 @@ if ($use_equo) {
538558
say "", "[install] Those dependencies will be installed with equo :",
539559
@packages_deps, "";
540560
if ($equo_split_install) {
541-
safe_call("equo i $equo_install_args --bdeps $_")
561+
safe_call("equo i $equo_install_args --bdeps '$_'")
542562
for ( @packages_deps, @equo_install )
543563
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
544564
if ( @equo_remove > 0 and !$pretend ) {
545565
say "Removing with equo: @equo_remove";
546-
system("equo rm --nodeps $_") for (@equo_remove);
566+
_system("equo rm --nodeps '$_'") for (@equo_remove);
547567
}
548568
}
549569
else {
550-
safe_call(
551-
"equo i $equo_install_args --bdeps @packages_deps @equo_install")
552-
if ( @packages_deps > 0 or @equo_install > 0 )
570+
my @p = map {"'$_'"} ( @packages_deps, @equo_install );
571+
my @r = map {"'$_'"} @equo_remove;
572+
safe_call("equo i $equo_install_args --bdeps @p")
573+
if ( @p > 0 )
553574
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
554-
system("equo rm --nodeps @equo_remove") if ( @equo_remove > 0 );
575+
_system("equo rm --nodeps @r") if ( @r > 0 );
555576
}
556577
}
557578

558579
say "*** Ready to compile, finger crossed ***";
559580

560-
system("emerge --info")
581+
_system("emerge --info")
561582
; #always give detailed information about the building environment, helpful to debug
562583

563584
my $rt;
564585

565586
if ( $emerge_remove and $emerge_remove ne "" ) {
566587
say "Removing with emerge: $emerge_remove";
567-
system("emerge -C $_") for split( / /, $emerge_remove );
588+
_system("emerge -C '$_'") for split( / /, $emerge_remove );
568589
}
569590

591+
_system("chmod +x /pre-script;./pre-script") if -e "/pre-script";
592+
570593
if ($emerge_split_install) {
571594
compile_packs( "targets", @packages );
572595
$rt = 0; #consider the build good anyway, like a "keep-going"
573596
}
574597
else {
575-
$rt = system("emerge $emerge_defaults_args -j $jobs @packages");
598+
my @p = map {"'$_'"} @packages;
599+
$rt = _system("emerge $emerge_defaults_args -j $jobs @p");
576600
}
577601

578602
my $return = $rt >> 8;
579603

580604
# best effort -B
581605
compile_packs( "injected_targets", @injected_packages );
582606

607+
_system("chmod +x /post-script;./post-script") if -e "/post-script";
608+
583609
if ( $preserved_rebuild and !$pretend ) {
584610

585-
system("emerge -j $jobs --buildpkg \@preserved-rebuild");
586-
system("revdep-rebuild");
611+
_system("emerge -j $jobs --buildpkg \@preserved-rebuild");
612+
_system("revdep-rebuild");
587613

588614
}
589615

590616
if ( $qualityassurance_checks == 1 ) {
591617
say "*** Quality assurance ***";
592-
foreach my $pn ( @packages, @injected_packages ) {
618+
foreach my $pn ( map { abs_atom; $_ } ( @packages, @injected_packages ) )
619+
{
593620
say ">> Running repoman on $pn";
594-
system(
621+
_system(
595622
"pushd \$(dirname \$(equery which $pn 2>/dev/null)); repoman; popd"
596623
);
597624
$pn =~ s/\:\:.*//g;
598625
say ">> Detecting missing dependencies for $pn";
599-
system("dynlink-scanner $pn");
600-
system("depcheck $pn");
626+
_system("dynlink-scanner $pn");
627+
_system("depcheck $pn");
601628
}
602629
}
603630

604631
if ( $obsoleted and $target_overlay ) {
605632
say "*** Detecting obsoletes ***";
606-
system("sabayon-detectobsolete --overlay ${target_overlay}");
633+
_system("sabayon-detectobsolete --overlay ${target_overlay}");
607634
}
608635

609636
# Copy files to artifacts folder

0 commit comments

Comments
 (0)