#!/usr/bin/perl =head1 NAME dh_builddeb - build Debian binary packages =cut use strict; use warnings; use Debian::Debhelper::Dh_Lib; our $VERSION = DH_BUILTIN_VERSION; =head1 SYNOPSIS B [S>] [B<--destdir=>I] [B<--filename=>I] [S I>] =head1 DESCRIPTION B simply calls L to build a Debian package or packages. It will also build dbgsym packages when L and L have prepared them. It supports building multiple binary packages in parallel, when enabled by DEB_BUILD_OPTIONS. =head1 OPTIONS =over 4 =item B<--destdir=>I Use this if you want the generated F<.deb> files to be put in a directory other than the default of "F<..>". =item B<--filename=>I 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<--> I Pass I to L when it is used to build the package. =item B<-u>I This is another way to pass I to L. It is deprecated; use B<--> instead. =back =cut init(options => { "filename=s" => \$dh{FILENAME}, "destdir=s" => \$dh{DESTDIR}, }); # Set the default destination directory. if (! defined $dh{DESTDIR}) { $dh{DESTDIR}='..'; } if (! defined $dh{FILENAME}) { $dh{FILENAME}=''; } else { $dh{FILENAME}="/$dh{FILENAME}"; } sub default_compressor_args { my ($default_comp, @args) = @_; for my $arg (@args) { # Explicit compressor arg given return @args if $arg =~ m/^-Z/; } return (@{$default_comp}, @args); } sub build_and_rename_deb { my ($package, $destdir, $cmd, $rename_sub) = @_; my $build_dir = "debian/.debhelper/scratch-space/build-${package}"; my ($dpkg_filename, $desired_filename); install_dir($build_dir); doit(@${cmd}, $build_dir); opendir(my $fd, $build_dir); for my $name (readdir($fd)) { next if $name eq '.' or $name eq '..'; if ($dpkg_filename) { error("\"@{$cmd}\" produced two debs: $dpkg_filename and $name"); } $dpkg_filename = $name; } closedir($fd); local $_ = $dpkg_filename; $rename_sub->(); $desired_filename = $_; if ($desired_filename ne $dpkg_filename) { print "\tRenaming $dpkg_filename to $desired_filename\n"; } rename_path("${build_dir}/${dpkg_filename}", "${destdir}/${desired_filename}"); } my @items; for my $package (@{$dh{DOPACKAGES}}) { push(@items, [$package, 0]); if (not is_udeb($package)) { my $dbgsym_tmpdir = "debian/.debhelper/${package}/dbgsym-root"; my $dbgsym_control = "${dbgsym_tmpdir}/DEBIAN/control"; if ( -f $dbgsym_control) { # Only build the dbgsym package if it has a control file. # People might have skipped dh_gencontrol. push(@items, [$package, 1]); } elsif (-d $dbgsym_tmpdir) { warning("Not building dbgsym package for ${package} as it has no control file"); warning("Please use dh_gencontrol to avoid this issue"); } } } on_items_in_parallel(\@items, sub { foreach my $item (@_) { my ($package, $dbgsym) = @{$item}; my $tmp=tmpdir($package); if ($dbgsym) { my $dbgsym_tmpdir = "debian/.debhelper/${package}/dbgsym-root"; # XXX: Should we blindly overrule the maintainer here? It # is not apparent that their explicit -z was intended for # the dbgsym package. my @args = default_compressor_args(["-z1", "-Zxz", "-Sextreme"], @{$dh{U_PARAMS}}); doit("dpkg-deb", @args, "--build", $dbgsym_tmpdir, $dh{DESTDIR}); next; } 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}; my @cmd = qw(dpkg-deb -z1 -Zxz -Sextreme); push(@cmd, @{$dh{U_PARAMS}}) if $dh{U_PARAMS}; push(@cmd, '--build', $tmp); if (! $filename) { # dpkg-gencontrol does not include "Package-Type" in the # control file (see #575059, #452273) for political # reasons. # # dh_builddeb used to guess the "correct" filename, but it # fell short when dpkg-gencontrol -V was used. The best # solution so far: Let dpkg-deb build the deb and # have dh_builddeb fix the extension. build_and_rename_deb($package, $dh{DESTDIR}, \@cmd, sub { s/\.deb$/\.udeb/g }); } else { doit(@cmd, $dh{DESTDIR}.$filename); } } } }); =head1 SEE ALSO L This program is a part of debhelper. =head1 AUTHOR Joey Hess =cut