]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh
Fix build system auto-selection breakage.
[debhelper.git] / dh
diff --git a/dh b/dh
index 6ac495a2e7d82822de1a851cf51ba9350449cff5..bd82d44bd4760e6870618cfa9f99b45c754866a2 100755 (executable)
--- a/dh
+++ b/dh
@@ -11,7 +11,7 @@ use Debian::Debhelper::Dh_Lib;
 
 =head1 SYNOPSIS
 
-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>>]
+B<dh> sequence [B<--with> I<addon>[,I<addon>,...]] [B<--list>] [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining>] [S<I<debhelper options>>]
 
 =head1 DESCRIPTION
 
@@ -45,13 +45,22 @@ you should Build-Depend on debhelper 7.0.50 or above.)
 
 =over 4
 
-=item B<--with> I<addon>
+=item B<--with> I<addon>[,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.
+than once, or multiple addons can be listed, separated by commas.
+This is used when there is a third-party package that provides
+debhelper commands. See the PROGRAMMING file for documentation about
+the sequence addon interface.
+
+=item B<--without> I<addon>
+
+The inverse of --with, disables using the given addon.
+
+=item B<--list>, B<-l>
+
+List all available addons.
 
 =item B<--until> I<cmd>
 
@@ -82,28 +91,6 @@ 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 SEQUENCE ADDONS
-
-When B<--with> I<addon> is used, dh loads the perl module
-Debian::Debhelper::Sequence::I<addon>. Two functions are provided to let
-the module add its commands to sequences:
-
-=over 4
-
-=item Debian::Debhelper::Dh_Lib::insert_before(existing_command, new_command)
-
-Insert I<new_command> in sequences before I<existing_command>.
-
-=item Debian::Debhelper::Dh_Lib::insert_after(existing_command, new_command)
-
-Insert I<new_command> in sequences after I<existing_command>.
-
-=item Debian::Debhelper::Dh_Lib::remove_command(existing_command)
-
-Remove I<existing_command> from the list of commands to run.
-
-=back
-
 =cut
 
 sub command_pos {
@@ -189,11 +176,37 @@ default. This is how to use dh_pycentral instead.
        %:
                dh --with python-central $@
 
+To patch your package using quilt, you can tell dh to use quilt's dh
+sequence addons like this:
+       
+       #!/usr/bin/make -f
+       %:
+               dh --with quilt $@
+
+Here is an example of overriding where the dh_auto_* commands find
+the package's source, for a package where the source is located in a
+subdirectory. It also forces use of perl's Module::Build build system,
+which can be necessary if debhelper wrongly detects that the package
+uses MakeMaker.
+
+       #!/usr/bin/make -f
+       %:
+               dh --sourcedirectory=src --buildsystem=perl_build $@
+
 =cut
 
 # Stash this away before init modifies it.
 my @ARGV_orig=@ARGV;
 
+# python-support is enabled by default, at least for now
+# (and comes first so python-central loads later and can disable it).
+unshift @ARGV, "--with=python-support";
+               
+# Disable complaints about unknown options for both dh and the commands
+# it runs. This is done because dh accepts and passes on options that may
+# be specific to only some debhelper commands.
+$ENV{DH_IGNORE_UNKNOWN_OPTIONS}=1;
+
 init(options => {
        "until=s" => \$dh{UNTIL},
        "after=s" => \$dh{AFTER},
@@ -201,11 +214,24 @@ init(options => {
        "remaining" => \$dh{REMAINING},
        "with=s" => sub {
                my ($option,$value)=@_;
-               push @{$dh{WITH}},$value;
+               push @{$dh{WITH}},split(",", $value);
+       },
+       "without=s" => sub {
+               my ($option,$value)=@_;
+               @{$dh{WITH}} = grep { $_ ne $value } @{$dh{WITH}};
        },
+       "l" => \$dh{LIST},
+       "list" => \$dh{LIST},
 });
 inhibit_log();
 
+# If make is using a jobserver, but it is not available
+# to this process, clean out MAKEFLAGS. This avoids
+# ugly warnings when calling make.
+if (is_make_jobserver_unavailable()) {
+       clean_jobserver_makeflags();
+}
+
 # Definitions of sequences.
 my %sequences;
 $sequences{build} = [qw{
@@ -234,7 +260,6 @@ $sequences{install} = [@{$sequences{build}}, qw{
        dh_installcatalogs
        dh_installcron
        dh_installdebconf
-       dh_installcatalogs
        dh_installemacsen
        dh_installifupdown
        dh_installinfo
@@ -254,7 +279,6 @@ $sequences{install} = [@{$sequences{build}}, qw{
        dh_gconf
        dh_icons
        dh_perl
-       dh_scrollkeeper
        dh_usrlocal
 
        dh_link
@@ -275,8 +299,8 @@ $sequences{binary} = [@{$sequences{install}}, qw{
 }, @b];
 $sequences{'binary-arch'} = [@{$sequences{binary}}];
 
-# --with python-support is enabled by default, at least for now
-unshift @{$dh{WITH}}, "python-support";
+# Additional command options
+my %command_opts;
 
 # sequence addon interface
 sub _insert {
@@ -313,12 +337,61 @@ sub remove_command {
        }
        
 }
+sub add_command {
+       my $command=shift;
+       my $sequence=shift;
+       unshift @{$sequences{$sequence}}, $command;
+}
+sub add_command_options {
+       my $command=shift;
+       push @{$command_opts{$command}}, @_;
+}
+sub remove_command_options {
+       my $command=shift;
+       if (@_) {
+               # Remove only specified options
+               if (my $opts = $command_opts{$command}) {
+                       foreach my $opt (@_) {
+                               $opts = [ grep { $_ ne $opt } @$opts ];
+                       }
+                       $command_opts{$command} = $opts;
+               }
+       }
+       else {
+               # Clear all additional options
+               delete $command_opts{$command};
+       }
+}
+
+if ($dh{LIST}) {
+       my %addons;
+
+       for my $inc (@INC) {
+               eval q{use File::Spec};
+               my $path = File::Spec->catdir($inc, "Debian/Debhelper/Sequence");
+               if (-d $path) {
+                       for my $module_path (glob "$path/*.pm") {
+                               my $name = basename($module_path);
+                               $name =~ s/\.pm$//;
+                               $name =~ s/_/-/g;
+                               $addons{$name} = 1;
+                       }
+               }
+       }
+
+       for my $name (sort keys %addons) {
+               print "$name\n";
+       }
+
+       exit 0;
+}
+
 foreach my $addon (@{$dh{WITH}}) {
        my $mod="Debian::Debhelper::Sequence::$addon";
        $mod=~s/-/_/g;
        eval "use $mod";
        if ($@) {
-               error("--with $addon not supported or failed to load module $mod");
+               error("unable to load addon $addon: $@");
        }
 }
 
@@ -361,11 +434,11 @@ elsif ($sequence eq 'binary-indep') {
 while (@ARGV_orig) {
        my $opt=shift @ARGV_orig;
        next if $opt eq $sequence;
-       if ($opt =~ /^--?(after|until|before|with)$/) {
+       if ($opt =~ /^--?(after|until|before|with|without)$/) {
                shift @ARGV_orig;
                next;
        }
-       elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with)=)/) {
+       elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without)=)/) {
                next;
        }
        push @options, $opt;
@@ -453,10 +526,14 @@ sub run {
                $override_command=$command;
                # This passes the options through to commands called
                # inside the target.
-               $ENV{DH_INTERNAL_OPTIONS}=join(" ", @options);
+               $ENV{DH_INTERNAL_OPTIONS}=join("\x1e", @options);
                $command="debian/rules";
                @options="override_".$override_command;
        }
+       else {
+               # Pass additional command options if any
+               unshift @options, @{$command_opts{$command}} if exists $command_opts{$command};
+       }
 
        # 3 space indent lines the command being run up under the 
        # sequence name after "dh ".
@@ -476,9 +553,13 @@ sub run {
                        # 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;
-                       write_log($override_command, keys %packages);
+                       # (But avoid logging for dh_clean since it removes
+                       # the log earlier.)
+                       if ($override_command ne 'dh_clean') {
+                               my %packages=map { $_ => 1 } @packages;
+                               map { delete $packages{$_} } @exclude;
+                               write_log($override_command, keys %packages);
+                       }
                }
        }
 }