From 3850b492a2234fc5debf940d99a6d063d91becb2 Mon Sep 17 00:00:00 2001 From: Vladimir Sokolovsky Date: Thu, 16 Feb 2012 10:34:23 +0200 Subject: [PATCH] build.pl: Add fork support Signed-off-by: Vladimir Sokolovsky --- build.pl | 172 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 106 insertions(+), 66 deletions(-) diff --git a/build.pl b/build.pl index 867a588..67f5606 100755 --- a/build.pl +++ b/build.pl @@ -188,6 +188,18 @@ sub set_cfg close (CONF); } +sub update_build_id +{ + my $name = shift @_; + my $msg = shift @_; + my $file = "$TOPDIR/BUILD_ID/$name"; + + open (MY_BUILD_ID, ">$file") or die "Can't open $file file: $!\n"; + print MY_BUILD_ID "$name" . ":\n"; + print MY_BUILD_ID "$msg\n"; + close (MY_BUILD_ID); +} + sub get_from_git { my $name = shift @_; @@ -222,11 +234,12 @@ sub get_from_git if ($name =~ /ofa_kernel/) { ex "$GIT checkout $ref ofed_scripts/ofed_checkout.sh"; ex "ofed_scripts/ofed_checkout.sh $ref"; - print BUILD_ID `git log -1 | head -1` . "\n"; + update_build_id($name, "$packages{$package}{'git_url'} $packages{$name}{'git_branch'}\n" . `git log -1 | head -1`); $packages{$name}{'version'} = (split '-',$version)[0]; if ($build_release) { $packages{$name}{'release'} = $release; + $packages{$name}{'release'} =~ s/-internal//; } else { $packages{$name}{'release'} = '1' . `setlocalversion`; } @@ -241,29 +254,16 @@ sub get_from_git } close IN; ex "ln -s ofed_scripts/ofa_kernel.spec"; + ex "/bin/rm -f ofed_scripts/compat-rdma.spec"; $targz = 'tgz'; - } elsif ($name =~ /mlnx-ofc/) { - ex "$GIT checkout $ref scripts/mlxfc_checkout.sh"; - ex "scripts/mlxfc_checkout.sh $ref"; - print BUILD_ID `git log -1 | head -1` . "\n"; - - ex "ln -snf scripts/makefile.mlnx_ofc makefile"; - ex "ln -snf scripts/Makefile.mlnx_ofc Makefile"; - - if ($build_release) { - $packages{$name}{'release'} = $release; - } else { - $packages{$name}{'release'} = '1' . `setlocalversion`; - } - ex "ln -s scripts/mlxfc.spec $name.spec"; - } else { ex "$GIT checkout $ref"; - print BUILD_ID `git log -1 | head -1` . "\n"; + update_build_id($name, "$packages{$package}{'git_url'} $packages{$name}{'git_branch'}\n" . `git log -1 | head -1`); if ($build_release) { $packages{$name}{'release'} = $release; + $packages{$name}{'release'} =~ s/-internal//; } else { $packages{$name}{'release'} = '1' . `setlocalversion`; } @@ -379,7 +379,7 @@ sub get_package if ($packages{$name}{'use_latest'}) { $url .= '/latest.txt'; ex "scp $url ."; - $packages{$name}{$method} = `grep $name latest.txt`; + $packages{$name}{$method} = `grep -w ^$name-[0-9] latest.txt`; chomp $packages{$name}{$method}; $url = $packages{$name}{'URL'} . '/' . $packages{$name}{$method}; $packages{$package}{'URL'} = $url; @@ -393,7 +393,7 @@ sub get_package if ($packages{$name}{'use_latest'}) { $url .= '/latest.txt'; ex "$WGET $url"; - $packages{$name}{$method} = `grep $name latest.txt`; + $packages{$name}{$method} = `grep -w ^$name-[0-9] latest.txt`; chomp $packages{$name}{$method}; $url = $packages{$name}{'URL'} . '/' . $packages{$name}{$method}; $packages{$package}{'URL'} = $url; @@ -422,10 +422,9 @@ sub get_srpm if (-d $packages{$name}{'local_tarball'}) { if ($packages{$name}{'use_latest'}) { - $packages{$name}{'local_tarball'} .= '/' . `grep $name "$packages{$name}{'local_tarball'}/latest.txt"`; + $packages{$name}{'local_tarball'} .= '/' . `grep -w ^$name-[0-9] "$packages{$name}{'local_tarball'}/latest.txt"`; chomp $packages{$name}{'local_tarball'}; - print BUILD_ID "$package:\n"; - print BUILD_ID "$packages{$package}{'local_tarball'}\n\n"; + update_build_id($package, "$packages{$package}{'local_tarball'}\n"); } } if (not -f $packages{$name}{'local_tarball'}) { @@ -498,8 +497,12 @@ if (not -d "$CWD/$packages_dir") { if ($build_release) { $release = $distribution . - '.' . (split '-',$version)[0] . - '.' . (split '-',$version)[1]; + '.' . (split '-',$version)[0]; + if ((split '-',$version)[1]) { + $release .= '.' . (split '-',$version)[1]; + } + $release =~ s/-internal//g; + $release =~ s/-/./g; } elsif ($build_daily) { $version .= '-' . $starttime; } else { @@ -536,11 +539,13 @@ if (-d $destdir) { mkpath([$destdir . '/RPMS', $destdir . '/SRPMS']); rmtree($TOPDIR); -mkpath([$TOPDIR . '/BUILD' ,$TOPDIR . '/RPMS',$TOPDIR . '/SOURCES',$TOPDIR . '/SPECS',$TOPDIR . '/SRPMS']); +mkpath([$TOPDIR . '/BUILD' ,$TOPDIR . '/RPMS',$TOPDIR . '/SOURCES',$TOPDIR . '/SPECS',$TOPDIR . '/SRPMS', $TOPDIR . '/BUILD_ID']); open (BUILD_ID, "+> $destdir/BUILD_ID") or die "Can't open $destdir/BUILD_ID file: $!\n"; print BUILD_ID "$distribution-$version:\n\n"; +my %info; + for my $conf (<$CWD/$packages_dir/*.conf>) { $package = basename($conf); $package =~ s/.conf//; @@ -552,56 +557,91 @@ for my $conf (<$CWD/$packages_dir/*.conf>) { next; } - if ($packages{$package}{'local_srpm'}) { - if (-d $packages{$package}{'local_srpm'}) { - if ($packages{$package}{'use_latest'}) { - $packages{$package}{'local_srpm'} .= '/' . `grep $package "$packages{$package}{'local_srpm'}/latest.txt"`; - chomp $packages{$package}{'local_srpm'}; + my $mypid = fork(); + die "Failed to fork: $!" if not defined $mypid; + + $info{$package}{pid} = $mypid; + + if ( not $mypid ) { + if ($packages{$package}{'local_srpm'}) { + if (-d $packages{$package}{'local_srpm'}) { + if ($packages{$package}{'use_latest'}) { + $packages{$package}{'local_srpm'} .= '/' . `grep -w ^$package-[0-9] "$packages{$package}{'local_srpm'}/latest.txt"`; + chomp $packages{$package}{'local_srpm'}; + } } - } - if (not -f $packages{$package}{'local_srpm'}) { - print_red "File $packages{$package}{'local_srpm'} does not exist"; - exit 1; - } - print_and_log "Using local copy: $packages{$package}{'local_srpm'}"; - copy "$packages{$package}{'local_srpm'}", "$destdir/SRPMS"; - print BUILD_ID "$package:\n"; - print BUILD_ID "$packages{$package}{'local_srpm'}\n\n"; - } else { - if ($packages{$package}{'getMethod'} =~ /git/) { - print BUILD_ID "$package:\n"; - print BUILD_ID "$packages{$package}{'git_url'} $packages{$package}{'git_branch'}\n"; - - if (not $packages{$package}{'local_tarball'}) { - get_from_git($package); + if (not -f $packages{$package}{'local_srpm'}) { + print_red "File $packages{$package}{'local_srpm'} does not exist"; + exit 1; } - get_srpm($package); - } elsif ($packages{$package}{'getMethod'} =~ /tarball/) { - if (not $packages{$package}{'local_tarball'}) { - get_package($package); - print BUILD_ID "$package:\n"; - print BUILD_ID "$packages{$package}{'URL'}\n\n"; - } - get_srpm($package); - } elsif ($packages{$package}{'getMethod'} =~ /srpm/) { - get_package($package); - print BUILD_ID "$package:\n"; - print BUILD_ID "$packages{$package}{'URL'}\n\n"; + print_and_log "Using local copy: $packages{$package}{'local_srpm'}"; + copy "$packages{$package}{'local_srpm'}", "$destdir/SRPMS"; + update_build_id($package, "$packages{$package}{'local_srpm'}\n"); } else { - print_red "Unsupported getMethod: $packages{$package}{'getMethod'}"; - exit 1; + if ($packages{$package}{'getMethod'} =~ /git/) { + + if (not $packages{$package}{'local_tarball'}) { + get_from_git($package); + } + + get_srpm($package); + } elsif ($packages{$package}{'getMethod'} =~ /tarball/) { + if (not $packages{$package}{'local_tarball'}) { + get_package($package); + update_build_id($package, "$packages{$package}{'URL'}\n"); + } + get_srpm($package); + } elsif ($packages{$package}{'getMethod'} =~ /srpm/) { + get_package($package); + update_build_id($package, "$packages{$package}{'URL'}\n"); + } else { + print_red "Unsupported getMethod: $packages{$package}{'getMethod'}"; + exit 1; + } + move "$packages{$package}{'local_srpm'}", "$destdir/SRPMS"; } - move "$packages{$package}{'local_srpm'}", "$destdir/SRPMS"; - } - # Cleanup - chdir $tmpdir; - for my $file (<$tmpdir/$package*>) { - rmtree $file; + # Cleanup + chdir $tmpdir; + for my $file (<$tmpdir/$package*>) { + rmtree $file; + } + + exit 0; } + + print "Child launched: package=$package child=$mypid\n" if ( $verbose ); + push (@plist, $package); } +my $ret = 0; + +for $package ( @plist ) { + my $res = 0; + my $sig = 0; + + print "waiting for: package=$package child=$info{$package}{pid}\n" if ( $verbose ); + waitpid ( $info{$package}{pid}, 0 ); + + $res = $? >> 8; + $sig = $? & 127; + if ($sig or $res) { + $ret ++; + print_red "Failed to build $package"; + } else { + print_green "Created $package source RPM" if ( $verbose ); + } +} + +exit $ret if ( $ret ); + +for $package ( @plist ) { + + my $fname = "$TOPDIR/BUILD_ID/$package"; + system ("cat $fname >> $destdir/BUILD_ID"); +} + if ($build_scripts) { $package = 'ofed-scripts'; print BUILD_ID "$package:\n"; -- 2.46.0