- or die "mkdir $localrepo/scratch: $!\nIf you haven't set up a local repository yet, you must read the README file.\n";
-}
-
-system "rm -f $localrepo/scratch/*";
-
-foreach my $name (@buildorder) {
- my $version = $srpms{$name}->{version};
- my $release = $srpms{$name}->{release};
- my $srpm_filename = $srpms{$name}->{filename};
-
- $release =~ s/\.fc?\d+$//; # "1.fc9" -> "1"
-
- foreach my $arch (@arches) {
- foreach my $distro (@distros) {
- # Does the built (binary) package exist already?
- my $pattern = "$localrepo/$distro/$arch/RPMS/$name-$version-$release.*.rpm";
- #print "pattern = $pattern\n";
- my @binaries = glob $pattern;
-
- if (@binaries == 0)
- {
- # Rebuild the package.
- print "*** building $name-$version-$release $arch $distro ***\n";
-
- createrepo ($arch, $distro);
- system ("mock -r $distro-$arch --resultdir $localrepo/scratch $srpm_filename") == 0
- or die "Build failed, return code $?\nLeaving the logs in $localrepo/scratch\n";
-
- # Build was a success so move the final RPMs into the
- # mock repo for next time.
- system ("mv $localrepo/scratch/*.src.rpm $localrepo/$distro/src/SRPMS") == 0 or die "mv";
- system ("mv $localrepo/scratch/*.rpm $localrepo/$distro/$arch/RPMS") == 0 or die "mv";
- my_mkdir "$localrepo/$distro/$arch/logs/$name-$version-$release";
- system ("mv $localrepo/scratch/*.log $localrepo/$distro/$arch/logs/$name-$version-$release/") == 0 or die "mv";
-
- createrepo ($arch, $distro);
- }
- else
- {
- print "skipping $name-$version-$release $arch $distro\n";
- }
- }
+ or die "mkdir $localrepo/scratch: $!\nIf you haven't set up a local repository yet, you must read the README file.\n";
+}
+
+system "rm -rf $localrepo/scratch/*";
+
+my @errors = ();
+
+# NB: Need to do the arch/distro in the outer loop to work
+# around the caching bug in mock/yum.
+foreach my $arch (@arches) {
+ foreach my $distro (@distros) {
+ foreach my $name (@buildorder) {
+ my $version = $srpms{$name}->{version};
+ my $release = $srpms{$name}->{release};
+ my $srpm_filename = $srpms{$name}->{filename};
+
+ $release =~ s/\.fc?\d+$//; # "1.fc9" -> "1"
+
+ # Does the built (binary) package exist already?
+ my $pattern = "$localrepo/$distro/$arch/RPMS/$name-$version-$release.*.rpm";
+ #print "pattern = $pattern\n";
+ my @binaries = glob $pattern;
+
+ if (@binaries == 0)
+ {
+ # Rebuild the package.
+ print "*** building $name-$version-$release $arch $distro ***\n";
+
+ createrepo ($arch, $distro);
+
+ my $scratchdir = "$localrepo/scratch/$name-$distro-$arch";
+ mkdir $scratchdir;
+
+ if (system ("mock -r $distro-$arch$suffix --resultdir $scratchdir $srpm_filename") == 0) {
+ # Build was a success so move the final RPMs into the
+ # mock repo for next time.
+ system ("mv $scratchdir/*.src.rpm $localrepo/$distro/src/SRPMS") == 0 or die "mv";
+ system ("mv $scratchdir/*.rpm $localrepo/$distro/$arch/RPMS") == 0 or die "mv";
+ my_mkdir "$localrepo/$distro/$arch/logs/$name-$version-$release";
+ system ("mv $scratchdir/*.log $localrepo/$distro/$arch/logs/$name-$version-$release/") == 0 or die "mv";
+ system "rm -rf $scratchdir";
+
+ createrepo ($arch, $distro);
+
+ }
+ else {
+ push @errors, "$name-$distro-$arch$suffix";
+ print STDERR "Build failed, return code $?\nLeaving the logs in $scratchdir\n";
+ exit 1 unless $keepgoing;
+ }
+ }
+ else
+ {
+ print "skipping $name-$version-$release $arch $distro\n";
+ }
+ }