]> git.openfabrics.org - ~vlad/build.git/commitdiff
build.pl: Add fork support
authorVladimir Sokolovsky <vlad@mellanox.com>
Thu, 16 Feb 2012 08:34:23 +0000 (10:34 +0200)
committerVladimir Sokolovsky <vlad@mellanox.com>
Thu, 16 Feb 2012 08:34:23 +0000 (10:34 +0200)
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
build.pl

index 867a588ca266e020f5fbbba74c941b840989406d..67f56066b09d2b31b8b2a7d47bf4674f20b9bd68 100755 (executable)
--- 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";