#!/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<dh_gencontrol> [S<I<debhelper options>>] [S<B<--> I<params>>]

=head1 DESCRIPTION

B<dh_gencontrol> is a debhelper program that is responsible for generating
control files, and installing them into the I<DEBIAN> directory with the
proper permissions.

This program is merely a wrapper around L<dpkg-gencontrol(1)>, which
calls it once for each package being acted on (plus related dbgsym
packages), and passes in some additional useful flags.

B<Note> that if you use B<dh_gencontrol>, you must also use
L<dh_builddeb(1)> to build the packages.  Otherwise, your build may
fail to build as B<dh_gencontrol> (via L<dpkg-gencontrol(1)>) declares
which packages are built.  As debhelper automatically generates dbgsym
packages, it some times adds additional packages, which will be built
by L<dh_builddeb(1)>.


=head1 OPTIONS

=over 4

=item B<--> I<params>

Pass I<params> to L<dpkg-gencontrol(1)>.

=item B<-u>I<params>, B<--dpkg-gencontrol-params=>I<params>

This is another way to pass I<params> to L<dpkg-gencontrol(1)>.
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 $dbgsym_info_dir = "debian/.debhelper/${package}";
	my $dbgsym_tmp = "${dbgsym_info_dir}/dbgsym-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 $dbgsym_info_dir ) {
		$build_ids = read_dbgsym_build_ids($dbgsym_info_dir);
	}

	# Temporary workaround: Do not build dbgsym packages for udebs as
	# dpkg-gencontrol and dpkg-deb does not agree on the file
	# extension.
	if ( -d $dbgsym_tmp and not is_udeb($package)) {
		my $multiarch = package_multiarch($package);
		my $section = package_section($package);
		my $replaces = read_dbgsym_migration($dbgsym_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 @dbgsym_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(@dbgsym_options, '-UMulti-Arch');
		}
		# If the dbgsym package is replacing an existing -dbg package,
		# then declare the necessary Breaks + Replaces.  Otherwise,
		# clear the fields.
		if ($replaces) {
			push(@dbgsym_options, "-DReplaces=${replaces}",
				 "-DBreaks=${replaces}");
		} else {
			push(@dbgsym_options, '-UReplaces', '-UBreaks');
		}
		if ( ! -d "${dbgsym_tmp}/DEBIAN" ) {
			install_dir("${dbgsym_tmp}/DEBIAN");
		}
		doit("dpkg-gencontrol", "-p${package}", "-l$changelog", "-T$substvars",
			"-P${dbgsym_tmp}",@{$dh{U_PARAMS}}, @dbgsym_options);

		doit("chmod","0644","${dbgsym_tmp}/DEBIAN/control");
		doit("chown","0:0","${dbgsym_tmp}/DEBIAN/control");
	} elsif ($build_ids) {
		# Only include the build-id if there is no dbgsym package (if
		# there is a dbgsym package, the build-ids into the control
		# file of the dbgsym package)
		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_dbgsym_file {
	my ($dbgsym_info_file, $dbgsym_info_dir) = @_;
	my $dbgsym_path = "${dbgsym_info_dir}/${dbgsym_info_file}";
	my $result;
	if (-f $dbgsym_path) {
		open(my $fd, '<', $dbgsym_path)
			or error("open $dbgsym_path failed: $!");
		chomp($result = <$fd>);
		close($fd);
	}
	return $result;
}

sub read_dbgsym_migration {
	return read_dbgsym_file('dbgsym-migration', @_);
}

sub read_dbgsym_build_ids {
	return read_dbgsym_file('dbgsym-build-ids', @_);
}

=head1 SEE ALSO

L<debhelper(7)>

This program is a part of debhelper.

=head1 AUTHOR

Joey Hess <joeyh@debian.org>

=cut

# Local Variables:
# indent-tabs-mode: t
# tab-width: 4
# cperl-indent-level: 4
# End:
