]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh_builddeb
dh_builddeb: support for parallel builds of debs
[debhelper.git] / dh_builddeb
index 07029c076dbe22fc9696b40f9e8a62582a2df42d..26e127464a36ee75c25bd0b7fcea5d74c6b0f4d8 100755 (executable)
@@ -2,7 +2,7 @@
 
 =head1 NAME
 
-dh_builddeb - build debian packages
+dh_builddeb - build Debian binary packages
 
 =cut
 
@@ -11,11 +11,11 @@ use Debian::Debhelper::Dh_Lib;
 
 =head1 SYNOPSIS
 
-B<dh_builddeb> [S<I<debhelper options>>] [B<--destdir=>I<directory>] [B<--name=>I<filename>] [S<B<--> I<params>>]
+B<dh_builddeb> [S<I<debhelper options>>] [B<--destdir=>I<directory>] [B<--filename=>I<name>] [S<B<--> I<params>>]
 
 =head1 DESCRIPTION
 
-dh_builddeb simply calls L<dpkg(8)> to build a debian package or
+B<dh_builddeb> simply calls L<dpkg-deb(1)> to build a Debian package or
 packages.
 
 =head1 OPTIONS
@@ -24,26 +24,32 @@ packages.
 
 =item B<--destdir=>I<directory>
 
-Use this if you want the generated .deb files to be put in a directory
-other than the default of ".."
+Use this if you want the generated F<.deb> files to be put in a directory
+other than the default of "F<..>".
 
-=item B<--name=>I<filename>
+=item B<--filename=>I<name>
 
 Use this if you want to force the generated .deb file to have a particular
 file name. Does not work well if more than one .deb is generated!
 
-=item B<-u>I<params>
-
 =item B<--> I<params>
 
-Pass I<params> to L<dpkg(1)|dpkg> when it is used to build the
+Pass I<params> to L<dpkg-deb(1)> when it is used to build the
 package.
 
+=item B<-u>I<params>
+
+This is another way to pass I<params> to L<dpkg-deb(1)>.
+It is deprecated; use B<--> instead.
+
 =back
 
 =cut
 
-init();
+init(options => {
+       "filename=s" => \$dh{FILENAME},
+       "destdir=s" => \$dh{DESTDIR},
+});
 
 # Set the default destination directory.
 if (! defined $dh{DESTDIR}) {
@@ -57,17 +63,59 @@ else {
        $dh{FILENAME}="/$dh{FILENAME}";
 }
 
+my $processes=1;
+my $max_procs=1;
+if (defined $ENV{DEB_BUILD_OPTIONS} && $ENV{DEB_BUILD_OPTIONS}=~/parallel=(\d+)/) {
+       $max_procs=$1;
+}
+
 foreach my $package (@{$dh{DOPACKAGES}}) {
-       my $tmp=tmpdir($package);
-       if (exists $ENV{DH_ALWAYS_EXCLUDE} && length $ENV{DH_ALWAYS_EXCLUDE}) {
-               complex_doit("find $tmp -name $ENV{DH_ALWAYS_EXCLUDE} | xargs rm -rf");
+       my $pid=0;
+
+       if ($max_procs > 1) {
+               while ($processes > $max_procs) {
+                       wait;
+                       $processes--;
+               }
+               $pid=fork();
+       }
+
+       if ($pid == 0) {
+               my $tmp=tmpdir($package);
+               if (exists $ENV{DH_ALWAYS_EXCLUDE} && length $ENV{DH_ALWAYS_EXCLUDE}) {
+                       if (! compat(5)) {
+                               complex_doit("find $tmp $dh{EXCLUDE_FIND} | xargs rm -rf");
+                       }
+                       else {
+                               # Old broken code here for compatibility. Does not
+                               # remove everything.
+                               complex_doit("find $tmp -name $_ | xargs rm -rf")
+                                       foreach split(":", $ENV{DH_ALWAYS_EXCLUDE});
+                       }
+               }
+               if (! is_udeb($package)) {
+                       doit("dpkg-deb", @{$dh{U_PARAMS}}, "--build", $tmp, $dh{DESTDIR}.$dh{FILENAME});
+               }
+               else {
+                       my $filename=$dh{FILENAME};
+                       if (! $filename) {
+                               $filename="/".udeb_filename($package);
+                       }
+                       doit("dpkg-deb", @{$dh{U_PARAMS}}, "--build", $tmp, $dh{DESTDIR}.$filename);
+               }
+               exit (0) if ($max_procs > 1);
+       } else {
+               if (!defined $pid) {
+                       error("fork failed!");
+               }
+               $processes++;
        }
-       doit("dpkg","--build",$tmp,"$dh{DESTDIR}$dh{FILENAME}",@{$dh{U_PARAMS}});
 }
+while (($max_procs > 0) && (wait != -1)) {}
 
 =head1 SEE ALSO
 
-L<debhelper(1)>
+L<debhelper(7)>
 
 This program is a part of debhelper.