]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh
add autotools_dev example
[debhelper.git] / dh
diff --git a/dh b/dh
index 61ea0aa53369821a35f74eb2ea0312aca21028e7..08a66bb2a25f7e01f082e8598d691de3cb833314 100755 (executable)
--- a/dh
+++ b/dh
@@ -24,16 +24,6 @@ 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.
 
-Each debhelper command will record when it's successfully run in
-debian/package.debhelper.log. (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.
-
 If debian/rules contains a target with a name like "override_I<dh_command>",
 then when it would normally run I<dh_command>, dh will instead call that
 target. The override target can then run the command with additional options,
@@ -145,9 +135,9 @@ easy way to do with is by adding an override target for that command.
        override_dh_installdocs:
                dh_installdocs README TODO
 
-Sometimes the automated dh_auto_configure and dh_auto_build can't guess
-what to do for a strange package. Here's how to avoid running either
-and instead run your own commands.
+Sometimes the automated L<dh_auto_configure(1)> and L<dh_auto_build(1)>
+can't guess what to do for a strange package. Here's how to avoid running
+either and instead run your own commands.
 
        #!/usr/bin/make -f
        %:
@@ -177,6 +167,15 @@ default. This is how to use dh_pycentral instead.
        %:
                dh $@ --with python-central
 
+If your package uses autotools and you want to freshen config.sub and
+config.guess with newer versions from the autotools-dev package
+at build time, you can use some commands provided in autotools-dev
+that automate it, like this.
+
+       #!/usr/bin/make -f
+       %:
+               dh $@ --with autotools_dev
+
 Here is how to force use of perl's Module::Build build system,
 which can be necessary if debhelper wrongly detects that the package
 uses MakeMaker.
@@ -200,9 +199,22 @@ subdirectory.
        %:
                dh $@ --sourcedirectory=src
 
-Finally, here is a way to prevent dh from running several commands
-that you don't want it to run, by defining empty override targets for each
-command.
+And here is an example of how to tell the dh_auto_* commands to build
+in a subdirectory, which will be removed on clean.
+
+       #!/usr/bin/make -f
+       %:
+               dh $@ --builddirectory=build
+
+If your package can be built in parallel, you can support parallel building
+as follows. Then I<dpkg-buildpackage -j> will work.
+
+       #!/usr/bin/make -f
+       %:
+               dh $@ --parallel
+
+Here is a way to prevent dh from running several commands that you don't
+want it to run, by defining empty override targets for each command.
 
        #!/usr/bin/make -f
        %:
@@ -211,6 +223,56 @@ command.
        # Commands not to run:
        override_dh_auto_test override_dh_compress override_dh_fixperms:
 
+Sometimes, you may need to make an override target only run commands when a
+particular package is being built. This can be accomplished using
+L<dh_listpackages(1)> to test what is being built. For example:
+
+       #!/usr/bin/make -f
+       %:
+               dh $@
+       
+       override_dh_fixperms:
+               dh_fixperms
+       ifneq (,$(findstring foo, $(shell dh_listpackages)))
+               chmod 4755 debian/foo/usr/bin/foo
+       endif
+
+Finally, remember that you are not limited to using override targets in the
+rules file when using dh. You can also explicitly define any of the regular
+rules file targets when it makes sense to do so. A common reason to do this
+is if your package needs different build-arch and build-indep targets. For
+example, a package with a long document build process can put it in
+build-indep to avoid build daemons redundantly building the documentation.
+
+       #!/usr/bin/make -f
+       %:
+               dh $@
+       
+       build: build-arch build-indep ;
+       build-indep:
+               $(MAKE) docs
+       build-arch:
+               $(MAKE) bins
+
+=head1 INTERNALS
+
+If you're curious about dh's internals, here's how it works under the hood.
+
+Each debhelper command will record when it's successfully run in
+debian/package.debhelper.log. (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.
+
+dh uses the DH_INTERNAL_OPTIONS environment variable to pass information
+through to debhelper commands that are run inside override targets. The
+contents (and indeed, existence) of this environment variable, as the name
+might suggest, is subject to change at any time.
+
 =cut
 
 # Stash this away before init modifies it.
@@ -233,12 +295,14 @@ init(options => {
                        my ($option,$value)=@_;
                        @{$dh{WITH}} = grep { $_ ne $value } @{$dh{WITH}};
                },
-               "l" => \$dh{LIST},
-               "list" => \$dh{LIST},
+               "l" => \&list_addons,
+               "list" => \&list_addons,
        },
-       # Disable complaints about unknown options; they are passed on the
-       # debhelper commands.
+       # Disable complaints about unknown options; they are passed on t
+       # the debhelper commands.
        ignore_unknown_options => 1,
+       # Bundling does not work well since there are unknown options.
+       bundling => 0,
 );
 inhibit_log();
 
@@ -381,7 +445,7 @@ sub remove_command_options {
        }
 }
 
-if ($dh{LIST}) {
+sub list_addons {
        my %addons;
 
        for my $inc (@INC) {
@@ -413,17 +477,31 @@ foreach my $addon (@{$dh{WITH}}) {
        }
 }
 
-# Get the sequence of commands to run.
-if (! @ARGV) {
+my $sequence;
+if (! compat(7)) {
+       # From v8, the sequence is the very first parameter.
+       $sequence=shift @ARGV_orig;
+       if ($sequence=~/^-/) {
+               error "Unknown sequence $sequence (options should not come before the sequence)";
+       }
+}
+else {
+       # Before v8, the sequence could be at any position in the parameters,
+       # so was what was left after parsing.
+       $sequence=shift;
+       if (defined $sequence) {
+               @ARGV_orig=grep { $_ ne $sequence } @ARGV_orig;
+       }
+}
+if (! defined $sequence) {
        error "specify a sequence to run";
 }
-my $sequence=shift;
 if ($sequence eq 'debian/rules' ||
     $sequence =~ /^override_dh_/) {
-       # make -B causes the rules file to be run as a target
-       # and support completly empty override targets
-       exit 0
-}      
+       # make -B causes the rules file to be run as a target.
+       # Also support completly empty override targets.
+       exit 0;
+}
 elsif (! exists $sequences{$sequence}) {
        error "Unknown sequence $sequence (choose from: ".
                join(" ", sort keys %sequences).")";
@@ -451,7 +529,6 @@ elsif ($sequence eq 'binary-indep') {
 }
 while (@ARGV_orig) {
        my $opt=shift @ARGV_orig;
-       next if $opt eq $sequence;
        if ($opt =~ /^--?(after|until|before|with|without)$/) {
                shift @ARGV_orig;
                next;