comply with the new policy.
A typical debian/rules file that uses debhelper will call several debhelper
-commands in sequence. Debhelper commands are all named with a "dh_" prefix.
-Examples of rules files that use debhelper are in
-F</usr/share/doc/debhelper/examples/>
+commands in sequence, or use L<dh(1)> to automate this process. Examples of
+rules files that use debhelper are in F</usr/share/doc/debhelper/examples/>
To create a new debian package using debhelper, you can just copy one of
the sample rules files and edit it by hand. Or you can try the dh-make
If none are given, debhelper programs default to acting on all packages listed
in the control file.
-See F</usr/share/doc/debhelper/examples/rules.multi> for an example of how to
-use this in a package that generates multiple binary packages.
-
=head2 Automatic generation of debian install scripts
Some debhelper commands will automatically generate parts of debian
it modifies its behavior in various ways.
Tell debhelper what compatibility level to use by writing a number to
-debian/compat. For example, to turn on V5 mode:
+debian/compat. For example, to turn on V7 mode:
- % echo 5 > debian/compat
+ % echo 7 > debian/compat
Unless otherwise indicated, all debhelper documentation assumes that you
are using the most recent compatibility level, and in most cases does not
debhelper to your Build-Depends line in debian/control. You should
build-depend on a version of debhelper equal to (or greater than) the
debhelper compatibility level your package uses. So if your package used
-compatibility level 6:
+compatibility level 7:
- Build-Depends: debhelper (>= 6)
+ Build-Depends: debhelper (>= 7)
=head1 ENVIRONMENT
--- /dev/null
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+dh - debhelper command sequencer
+
+=cut
+
+use strict;
+use Debian::Debhelper::Dh_Lib;
+
+=head1 SYNOPSIS
+
+B<dh> sequence [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining> [S<I<debhelper options>>]
+
+=head1 DESCRIPTION
+
+dh runs a sequence of debhelper commands. The supported sequences
+correspond to the targets of a debian/rules file: "build", "clean",
+"install", "binary-arch", "binary-indep", and "binary".
+
+Commands in the binary-indep sequence are passed the "-i" option to ensure
+they only work on binary independent packages, and commands in the
+binary-arch sequences are passed the "-a" option to ensure they only work
+on architecture dependent packages.
+
+Options passed to dh are passed on to each command it runs. This can be
+used to set an option like "-v" or "-X" or "-N", as well as for more
+specialised options.
+
+Each debhelper command will record when it's successfully run in
+debian/package.log.debhelper. (Which dh_clean deletes.) So dh can tell
+which commands have already been run, for which packages, and skip running
+those commands again.
+
+Each time dh is run, it examines the log, and finds the last logged command
+that is in the specified sequence. It then continues with the next command
+in the sequence. The B<--until>, B<--before>, B<--after>, and B<--remaining>
+options can override this behavior.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--until> I<cmd>
+
+Run commands in the sequence until and including I<cmd>, then stop.
+
+=item B<--before> I<cmd>
+
+Run commands in the sequence before I<cmd>, then stop.
+
+=item B<--after> I<cmd>
+
+Run commands in the sequence that come after I<cmd>.
+
+=item B<--remaining>
+
+Run all commands in the sequence that have yet to be run.
+
+=head1 COMMAND SPECIFICATON
+
+I<cmd> can be a full name of a debhelper command, or a substring. It'll first
+search for a command in the sequence exactly matching the name, to avoid any
+ambiguity. If there are multiple substring matches, the last one in the
+sequence will be used.
+
+=head1 EXAMPLES
+
+To see what commands are included in a sequence, without actually doing
+anything:
+
+ dh binary-arch -n
+
+This is a very simple rules file, for packages where the default seqences of
+commands work with no additional options.
+
+ #!/usr/bin/make -f
+ %:
+ dh %@
+
+This is a simple rules file that is a good starting place for customisation.
+(It's also available in F</usr/share/doc/debhelper/examples/rules.simple>
+
+ #!/usr/bin/make -f
+
+ build:
+ dh build
+
+ clean:
+ dh clean
+
+ install: build
+ dh install
+
+ binary-arch: install
+ dh binary-arch
+
+ binary-indep: install
+ dh binary-indep
+
+ binary: binary-arch binary-indep
+
+Often you'll want to pass an option to ./configure. This uses dh to run all
+commands before L<dh_auto_configure(1)>, then runs that command by hand,
+and then finished up by running the rest of the sequence. You could also
+run ./configure by hand, instead of bothering with using dh_auto_configure.
+And if necessary, you can add commands to run automake, etc here too.
+
+ build:
+ dh build --before configure
+ dh_auto_configure --kitchen-sink=yes
+ dh build --after configure
+
+Here's how to skip two automated in a row (configure and build), and
+instead run the commands by hand.
+
+ build:
+ dh build --before configure
+ ./mondoconfig
+ make universe-explode-in-delight
+ dh build --after build
+
+Another common case is wanting to run some code manually after a particular
+debhelper command is run.
+
+ binary-arch: install
+ dh binary-arch --until dh_fixperms
+ # dh_fixperms has run, now override it for one program
+ chmod 4755 debian/foo/usr/bin/foo
+ # and continue
+ dh binary-arch --after dh_fixperms
+
+It's also fine to run debhelper commands before starting the dh sequence.
+Just be sure to use the B<--remaining> option to ensure that commands
+that normally come before those in the sequence are still run.
+
+ binary-arch: install
+ dh_strip -X foo
+ dh_fixperms -X bar
+ dh binary-arch --remaining
+
+=cut
+
+# Stash this away before init modifies it.
+my @ARGV_orig=@ARGV;
+
+init();
+
+# Definitions of sequences.
+my %sequences;
+$sequences{build} = [qw{
+ dh_testdir
+ dh_auto_configure
+ dh_auto_build
+ dh_auto_test
+}],
+$sequences{clean} = [qw{
+ dh_testdir
+ dh_auto_clean
+ dh_clean
+}];
+$sequences{install} = [@{$sequences{build}}, "dh_testroot", "dh_clean -k", qw{
+ dh_installdirs
+ dh_auto_install
+
+ dh_install
+ dh_installdocs
+ dh_installchangelogs
+ dh_installexamples
+ dh_installman
+
+ dh_installcatalogs
+ dh_installcron
+ dh_installdebconf
+ dh_installcatalogs
+ dh_installemacsen
+ dh_installifupdown
+ dh_installinfo
+ dh_installinit
+ dh_installmenu
+ dh_installmime
+ dh_installmodules
+ dh_installpam
+ dh_installppp
+ dh_installudev
+ dh_installwm
+ dh_installxfonts
+ dh_lintian
+ dh_desktop
+ dh_gconf
+ dh_icons
+ dh_logcheck
+ dh_logrotate
+ dh_perl
+ dh_python
+ dh_scrollkeeper
+ dh_uselocal
+
+ dh_link
+ dh_compress
+ dh_fixperms
+}];
+my @b=qw{
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+};
+$sequences{'binary-indep'} = [@{$sequences{install}}, @b];
+$sequences{binary} = [@{$sequences{install}}, qw{
+ dh_strip
+ dh_makeshlibs
+ dh_shlibdeps
+}, @b];
+$sequences{'binary-arch'} = [@{$sequences{binary}}];
+
+# Sequence parameter.
+if (! @ARGV) {
+ error "specify a sequence to run";
+}
+my $sequence=shift;
+if (! exists $sequences{$sequence}) {
+ error "Unknown sequence $sequence (chose from: ".
+ join(" ", sort keys %sequences).")";
+}
+
+# Get the options to pass to commands in the sequence.
+# Filter out options intended only for this program.
+my @options;
+if ($sequence eq 'binary-arch') {
+ push @options, "-a";
+}
+elsif ($sequence eq 'binary-indep') {
+ push @options, "-i";
+}
+while (@ARGV_orig) {
+ my $opt=shift @ARGV_orig;
+ next if $opt eq $sequence;
+ if ($opt =~ /^--?(after|until|before)$/) {
+ shift @ARGV_orig;
+ next;
+ }
+ elsif ($opt =~ /^--?(remaining|(after|until|before)=)/) {
+ next;
+ }
+ push @options, $opt;
+}
+
+@options=grep {
+ $_ ne $sequence && !/^--?(before|after|remaining)$/
+} @options;
+
+foreach my $cmd (@{$sequences{$sequence}}) {
+ print "$cmd @options\n";
+}
+
+foreach my $package (@{$dh{DOPACKAGES}}) {
+ my $tmp=tmpdir($package);
+ my $ext=pkgext($package);
+}
+
+=head1 SEE ALSO
+
+L<debhelper(7)>
+
+This program is a part of debhelper.
+
+=head1 AUTHOR
+
+Joey Hess <joeyh@debian.org>
+
+=cut