]> git.donarmstrong.com Git - debhelper.git/commitdiff
dh override targets
authorJoey Hess <joey@gnu.kitenet.net>
Mon, 16 Feb 2009 19:55:55 +0000 (14:55 -0500)
committerJoey Hess <joey@gnu.kitenet.net>
Mon, 16 Feb 2009 19:55:55 +0000 (14:55 -0500)
* dh: debian/rules override targets can change what is run
  for a specific debhelper command in a sequence.
* dh: Redid all the examples to use override targets, since these
  eliminate all annoying boilerplate and are much easier to understand
  than the old method.
* Remove rules.simple example, there's no need to use explcit targets
  with dh anymore.

Debian/Debhelper/Dh_Getopt.pm
Debian/Debhelper/Dh_Lib.pm
debian/changelog
dh
examples/rules.simple [deleted file]

index 950a37b97a6bac18f40bbbe0482133cff5748c6a..ddfb71b62742a95f58392d463bbcfc6c8f4c171b 100644 (file)
@@ -159,6 +159,14 @@ sub parseopts {
                }
        }
 
+       # DH_INTERNAL_OPTIONS is used to pass additional options from
+       # dh through an override target to a command.
+       if (defined $ENV{DH_INTERNAL_OPTIONS}) {
+               $ENV{DH_INTERNAL_OPTIONS}=~s/^\s+//;
+               $ENV{DH_INTERNAL_OPTIONS}=~s/\s+$//;
+               unshift @ARGV, split(/\s+/,$ENV{DH_INTERNAL_OPTIONS});
+       }
+
        my $ret=getoptions(\@ARGV, $options);
        if (!$ret) {
                warning("warning: unknown options will be a fatal error in a future debhelper release");
index 4df64c8748a1b3f98d9abcab5d449eabc905e063..f0aa71df5c68270abf9da0969968e6d6e05c913b 100644 (file)
@@ -27,6 +27,7 @@ sub init {
        # If so, we need to pass this off to the resource intensive 
        # Getopt::Long, which I'd prefer to avoid loading at all if possible.
        if ((defined $ENV{DH_OPTIONS} && length $ENV{DH_OPTIONS}) ||
+           (defined $ENV{DH_INTERNAL_OPTIONS} && length $ENV{DH_INTERNAL_OPTIONS}) ||
            grep /^-/, @ARGV) {
                eval "use Debian::Debhelper::Dh_Getopt";
                error($@) if $@;
@@ -102,14 +103,20 @@ sub init {
 my $write_log=1;
 sub END {
        if ($? == 0 && $write_log) {
-               my $cmd=basename($0);
-               foreach my $package (@{$dh{DOPACKAGES}}) {
-                       my $ext=pkgext($package);
-                       my $log="debian/${ext}debhelper.log";
-                       open(LOG, ">>", $log) || error("failed to write to ${log}: $!");
-                       print LOG $cmd."\n";
-                       close LOG;
-               }
+               write_log(basename($0), @{$dh{DOPACKAGES}});
+       }
+}      
+
+sub write_log {
+       my $cmd=shift;
+       my @packages=@_;
+
+       foreach my $package (@packages) {
+               my $ext=pkgext($package);
+               my $log="debian/${ext}debhelper.log";
+               open(LOG, ">>", $log) || error("failed to write to ${log}: $!");
+               print LOG $cmd."\n";
+               close LOG;
        }
 }
 
index 29fa6d1e34200f5f1db0442001c0ed1b5388d5c4..58a02b38d9bc7001dbe452691cf05c58a751bad6 100644 (file)
@@ -1,5 +1,12 @@
-debhelper (7.1.2) UNRELEASED; urgency=low
-
+debhelper (7.2.0) UNRELEASED; urgency=low
+
+  * dh: debian/rules override targets can change what is run
+    for a specific debhelper command in a sequence.
+  * dh: Redid all the examples to use override targets, since these
+    eliminate all annoying boilerplate and are much easier to understand
+    than the old method.
+  * Remove rules.simple example, there's no need to use explcit targets
+    with dh anymore.
   * dh: Fix typo. Closes: #509754
   * debhelper.pod: Fix typo. Closes: #510180
   * dh_gconf: Support mandatory settings. Closes: #513923
diff --git a/dh b/dh
index 4cfd3e1a220c990f8bbfd363f14e6aa057b1cb1a..4191d0be8e217f4dc0af737e8896fbc186721ae2 100755 (executable)
--- a/dh
+++ b/dh
@@ -11,7 +11,7 @@ use Debian::Debhelper::Dh_Lib;
 
 =head1 SYNOPSIS
 
-B<dh> sequence [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining>] [B<--with> I<addon>] [S<I<debhelper options>>]
+B<dh> sequence [B<--with> I<addon>] [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining>] [S<I<debhelper options>>]
 
 =head1 DESCRIPTION
 
@@ -34,10 +34,25 @@ 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 gets to that command in the sequence, dh will run that
+target from the rules file, rather than running the actual command. The
+override target can then run the command with additional options, or run
+entirely different commands instead. (Note that to use this feature,
+you should Build-Depend on debhelper 7.2 or above.)
+
 =head1 OPTIONS
 
 =over 4
 
+=item B<--with> I<addon>
+
+Add the debhelper commands specified by the given addon to appropriate places
+in the sequence of commands that is run. This option can be repeated more
+than once, and is used when there is a third-party package that provides
+debhelper commands. See "SEQUENCE ADDONS" below for documentation about what
+such packages should do to be supported by --with.
+
 =item B<--until> I<cmd>
 
 Run commands in the sequence until and including I<cmd>, then stop.
@@ -54,14 +69,6 @@ Run commands in the sequence that come after I<cmd>.
 
 Run all commands in the sequence that have yet to be run.
 
-=item B<--with> I<addon>
-
-Add the debhelper commands specified by the given addon to appropriate places
-in the sequence of commands that is run. This option can be repeated more
-than once, and is used when there is a third-party package that provides
-debhelper commands. See "SEQUENCE ADDONS" below for documentation about what
-such packages should do to be supported by --with.
-
 =back
 
 All other options passed to dh are passed on to each command it runs. This
@@ -137,84 +144,43 @@ commands work with no additional options.
        %:
                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>
-
+Often you'll want to pass an option to a specific debhelper command. The
+easy way to do with is by adding an override target for that command.
+       
        #!/usr/bin/make -f
+       %:
+               dh $@
 
-       build: build-stamp
-       build-stamp:
-               dh build
-               touch build-stamp
-
-       clean:
-               dh clean
-
-       install: build install-stamp
-       install-stamp:
-               dh install
-               touch install-stamp
-
-       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 finishes 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.
+       override_dh_strip:
+               dh_strip -Xfoo
+               
+       override_dh_installdocs:
+               dh_installdocs README TODO
 
-       build: build-stamp
-       build-stamp:
-               dh build --before configure
-               dh_auto_configure -- --kitchen-sink=yes
-               dh build --after configure
-               touch build-stamp
+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.
 
-Here's how to skip two automated steps in a row (configure and build), and
-instead run the commands by hand.
+       #!/usr/bin/make -f
+       %:
+               dh $@
 
-       build: build-stamp
-       build-stamp:
-               dh build --before configure
+       override_dh_auto_configure:
                ./mondoconfig
+
+       override_dh_auto_build:
                make universe-explode-in-delight
-               dh build --after build
-               touch build-stamp
 
-Another common case is wanting to run some code manually after a particular
-debhelper command is run.
+Another common case is wanting to do something manually before or
+after a particular debhelper command is run.
 
-       install: build install-stamp
-       install-stamp:
-               dh install --until dh_fixperms
-               # dh_fixperms has run, now override it for one program
-               chmod 4755 debian/foo/usr/bin/foo
-               # and continue
-               dh install --after dh_fixperms
-               touch install-stamp
-
-It's also fine to run debhelper commands early. Just make sure that at
-least dh_prep is run from the sequence first, and be sure to use the
-B<--remaining> option to ensure that commands that normally come before
-those in the sequence are still run.
-
-       install: build install-stamp
-       install-stamp:
-               dh install --until dh_prep
-               dh_installdocs README TODO
-               dh_installchangelogs Changes
-               dh install --remaining
-               touch install-stamp
+       #!/usr/bin/make -f
+       %:
+               dh $@
 
-        binary-arch: install
-                dh_strip -X foo
-                dh binary-arch --remaining
+       override_dh_fixperms:
+               dh_fixperms
+               chmod 4755 debian/foo/usr/bin/foo
 
 =cut
 
@@ -453,21 +419,33 @@ foreach my $i (0..$stoppoint) {
                # Command already done for all packages.
                next;
        }
-       elsif (! @exclude) {
-               # Run command for all packages.
-               run($sequence[$i], @options);
-       }
-       else {
-               # Run command for only a subset of packages.
-               run($sequence[$i], @options,
-                       map { "-N$_" } @exclude);
-       }
+
+       run($sequence[$i], \@packages, \@exclude, @options);
 }
 
 sub run {
        my $command=shift;
+       my @packages=@{shift()};
+       my @exclude=@{shift()};
        my @options=@_;
        
+       # Check for override targets in debian/rules and
+       # run them instead of running the command directly.
+       my $override_command;
+       if (rules_explicit_target("override_".$command)) {
+               $override_command=$command;
+               # This passes the options through to commands called
+               # inside the target.
+               $ENV{DH_INTERNAL_OPTIONS}=join(" ", @options);
+               $command="debian/rules";
+               @options="override_".$override_command;
+       }
+       else {
+               # If some packages are excluded, add flags
+               # to prevent them from being acted on.
+               push @options, map { "-N$_" } @exclude;
+       }
+
        # 3 space indent lines the command being run up under the 
        # sequence name after "dh ".
        print "   ".escape_shell($command, @options)."\n";
@@ -480,6 +458,16 @@ sub run {
                elsif ($ret) {
                        exit 1;
                }
+
+               if (defined $override_command) {
+                       delete $ENV{DH_INTERNAL_OPTIONS};
+                       # Need to handle logging for overriden commands here,
+                       # because the actual debhelper command may not have
+                       # been run by the rules file target.
+                       my %packages=map { $_ => 1 } @packages;
+                       map { delete $packages{$_} } @exclude;
+                       Debian::Debhelper::Dh_Lib::write_log($override_command, keys %packages);
+               }
        }
 }
 
@@ -508,6 +496,31 @@ sub writelog {
        close LOG;
 }
 
+{
+my %targets;
+my $rules_parsed;
+
+sub rules_explicit_target {
+       # Checks if a specified target exists as an explicit target
+       # in debian/rules. 
+       # Currently this is accomplished via a stupid makefile parser.
+       my $target=shift;
+       
+       if (! $rules_parsed) {  
+               open(IN, "<debian/rules") || warning("dh cannot read debian/rules: $!");
+               while (<IN>) {
+                       if (/^([a-zA-Z_]+):/) {
+                               $targets{$1}=1;
+                       }
+               }
+               close IN;
+       }
+
+       return exists $targets{$target};
+}
+
+}
+
 =head1 SEE ALSO
 
 L<debhelper(7)>
diff --git a/examples/rules.simple b/examples/rules.simple
deleted file mode 100755 (executable)
index ab49db9..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/make -f
-
-build: build-stamp
-build-stamp:
-       dh build
-       touch build-stamp
-
-clean:
-       dh clean
-
-install: build install-stamp
-install-stamp:
-       dh install
-       touch install-stamp
-
-binary-arch: install
-       dh binary-arch
-
-binary-indep: install
-       dh binary-indep
-
-binary: binary-arch binary-indep