#!/usr/bin/perl =head1 NAME dh_gencontrol - generate and install control file =cut use strict; use warnings; use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS B [S>] [S I>] =head1 DESCRIPTION B is a debhelper program that is responsible for generating control files, and installing them into the I directory with the proper permissions. This program is merely a wrapper around L, which calls it once for each package being acted on (plus related ddebs), and passes in some additional useful flags. B that if you use B, you must also use L to build the packages. Otherwise, your build may fail to build as B (via L) declares which packages are built. As debhelper automatically generates ddebs, it some times adds additional packages, which will be built by L. =head1 OPTIONS =over 4 =item B<--> I Pass I to L. =item B<-u>I, B<--dpkg-gencontrol-params=>I This is another way to pass I to L. It is deprecated; use B<--> instead. =back =cut init(options => { "dpkg-gencontrol-params=s", => \$dh{U_PARAMS}, }); foreach my $package (@{$dh{DOPACKAGES}}) { my $tmp=tmpdir($package); my $ext=pkgext($package); my $ddeb_info_dir = "debian/.debhelper/${package}"; my $ddeb_tmp = "${ddeb_info_dir}/ddeb-root"; my $substvars="debian/${ext}substvars"; my $changelog=pkgfile($package,'changelog'); if (! $changelog) { $changelog='debian/changelog'; } if ( ! -d "$tmp/DEBIAN" ) { install_dir("$tmp/DEBIAN"); } # avoid gratuitous warning if (! -e $substvars || system("grep -q '^misc:Depends=' $substvars") != 0) { complex_doit("echo misc:Depends= >> $substvars"); } # avoid (another) gratuitous warning if (! -e $substvars || system("grep -q '^misc:Pre-Depends=' $substvars") != 0) { complex_doit("echo misc:Pre-Depends= >> $substvars"); } my (@debug_info_params, $build_ids); if ( -d $ddeb_info_dir ) { $build_ids = read_ddeb_build_ids($ddeb_info_dir); } # Temporary workaround: Do not build ddebs for udebs as # dpkg-gencontrol and dpkg-deb does not agree on the file # extension. if ( -d $ddeb_tmp and not is_udeb($package)) { my $multiarch = package_multiarch($package); my $section = package_section($package); my $replaces = read_ddeb_migration($ddeb_info_dir); my $component = ''; if ($section =~ m{^(.*)/[^/]+$}) { $component = "${1}/"; # This should not happen, but lets not propogate the error # if does. $component = '' if $component eq 'main/'; } # Remove and override more or less every standard field. my @ddeb_options = (qw( -UPre-Depends -URecommends -USuggests -UEnhances -UProvides -UEssential -UConflicts -DPriority=extra -DAuto-Built-Package=debug-symbols ), "-DPackage=${package}-dbgsym", "-DDepends=${package} (= \${binary:Version})", "-DDescription=Debug symbols for ${package}", "-DBuild-Ids=${build_ids}", "-DSection=${component}debug", ); # Disable multi-arch unless the original package is an # multi-arch: same package. In all other cases, we do not # need a multi-arch value. if ($multiarch ne 'same') { push(@ddeb_options, '-UMulti-Arch'); } # If the ddeb is replacing an existing -dbg package, then # declare the necessary Breaks + Replaces. Otherwise, clear # the fields. if ($replaces) { push(@ddeb_options, "-DReplaces=${replaces}", "-DBreaks=${replaces}"); } else { push(@ddeb_options, '-UReplaces', '-UBreaks'); } if ( ! -d "${ddeb_tmp}/DEBIAN" ) { install_dir("${ddeb_tmp}/DEBIAN"); } doit("dpkg-gencontrol", "-p${package}", "-l$changelog", "-T$substvars", "-P${ddeb_tmp}",@{$dh{U_PARAMS}}, @ddeb_options); doit("chmod","0644","${ddeb_tmp}/DEBIAN/control"); doit("chown","0:0","${ddeb_tmp}/DEBIAN/control"); } elsif ($build_ids) { # Only include the build-id if there is no ddeb (if there is a # ddeb, the build-ids into the ddeb's control file) push(@debug_info_params, "-DBuild-Ids=${build_ids}"); } # Generate and install control file. doit("dpkg-gencontrol", "-p$package", "-l$changelog", "-T$substvars", "-P$tmp", @debug_info_params, @{$dh{U_PARAMS}}); # This chmod is only necessary if the user sets the umask to # something odd. doit("chmod","0644","$tmp/DEBIAN/control"); doit("chown","0:0","$tmp/DEBIAN/control"); } sub read_ddeb_file { my ($ddeb_info_file, $ddeb_info_dir) = @_; my $ddeb_path = "${ddeb_info_dir}/${ddeb_info_file}"; my $result; if (-f $ddeb_path) { open(my $fd, '<', $ddeb_path) or error("open $ddeb_path failed: $!"); chomp($result = <$fd>); close($fd); } return $result; } sub read_ddeb_migration { return read_ddeb_file('ddeb-migration', @_); } sub read_ddeb_build_ids { return read_ddeb_file('ddeb-build-ids', @_); } =head1 SEE ALSO L This program is a part of debhelper. =head1 AUTHOR Joey Hess =cut # Local Variables: # indent-tabs-mode: t # tab-width: 4 # cperl-indent-level: 4 # End: