@@ -44,6 +44,7 @@ my $remote_portdir = $ENV{REMOTE_PORTDIR};
4444my $pretend = $ENV {PRETEND } // 0;
4545my $obsoleted = $ENV {DETECT_OBSOLETE } // 0;
4646my $target_overlay = $ENV {TARGET_OVERLAY };
47+ my $verbose = $ENV {BUILDER_VERBOSE } // 0;
4748
4849my $make_conf = $ENV {MAKE_CONF };
4950
@@ -67,11 +68,16 @@ sub say { print join( "\n", @_ ) . "\n"; }
6768
6869sub 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+
7581sub 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
97105sub 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
125133auto-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)
233242sub atom { s / -[0-9]{1,}.*$// ; }
234243
244+ sub abs_atom { atom; s / ^(\< |\> |=)+// }
245+
235246# Same again as a function
236247sub 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
240258sub 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 {
310328say " ****************************************************" ;
311329
312330my $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
317337say " Detected overlays: @parsed_overlays " if @parsed_overlays ;
318338
319- @overlays = uniq(@overlays ,@parsed_overlays );
339+ @overlays = uniq( @overlays , @parsed_overlays );
320340
321341if ( @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
346366if ( $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}
352372else {
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
357377if ( $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
369389my $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
376396if ( !-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}
382402else {
@@ -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
392412qx{
393413echo '[$reponame ]
@@ -404,48 +424,48 @@ if ( $remote_overlay and $remote_overlay ne "" ) {
404424if ( $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}
409429if ( $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
417437unless ( $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
434454if ( $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}
438458elsif ( $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
444464if ($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
558579say " *** 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
563584my $rt ;
564585
565586if ( $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+
570593if ($emerge_split_install ) {
571594 compile_packs( " targets" , @packages );
572595 $rt = 0; # consider the build good anyway, like a "keep-going"
573596}
574597else {
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
578602my $return = $rt >> 8;
579603
580604# best effort -B
581605compile_packs( " injected_targets" , @injected_packages );
582606
607+ _system(" chmod +x /post-script;./post-script" ) if -e " /post-script" ;
608+
583609if ( $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
590616if ( $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
604631if ( $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