X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh;h=289e7fc253fc9b3e3f37a484c4127f18c53f97b1;hb=ec77e19bf7a20d35edadb2089c3632fca8f54ed3;hp=cf6d1d2d64fd3c941efbc7e4f3f5a276416cebdb;hpb=7bce3f50a494bec6c023a9156175f463ba11d9c6;p=debhelper.git diff --git a/dh b/dh index cf6d1d2..289e7fc 100755 --- a/dh +++ b/dh @@ -11,7 +11,7 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B sequence [B<--until> I] [B<--before> I] [B<--after> I] [B<--remaining> [S>] +B sequence [B<--until> I] [B<--before> I] [B<--after> I] [B<--remaining>] [B<--with> I] [S>] =head1 DESCRIPTION @@ -54,6 +54,14 @@ Run commands in the sequence that come after I. Run all commands in the sequence that have yet to be run. +=item B<--with> I + +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 @@ -67,6 +75,28 @@ 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 is used, dh loads the perl module +Debian::Debhelper::Sequence::I. 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 in sequences before I. + +=item Debian::Debhelper::Dh_Lib::insert_after(existing_command, new_command) + +Insert I in sequences after I. + +=item Debian::Debhelper::Dh_Lib::remove_command(existing_command) + +Remove I from the list of commands to run. + +=back + =cut sub command_pos { @@ -100,26 +130,29 @@ anything: dh binary-arch --no-act -This is a very simple rules file, for packages where the default seqences of +This is a very simple rules file, for packages where the default sequences of commands work with no additional options. #!/usr/bin/make -f %: - dh %@ + dh $@ This is a simple rules file that is a good starting place for customisation. (It's also available in F #!/usr/bin/make -f - build: + build: build-stamp dh build + touch build-stamp clean: dh clean - install: build + install: build install-stamp + install-stamp: dh install + touch install-stamp binary-arch: install dh binary-arch @@ -135,38 +168,48 @@ 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: + build: build-stamp + build-stamp: dh build --before configure - dh_auto_configure --kitchen-sink=yes + dh_auto_configure -- --kitchen-sink=yes dh build --after configure + touch build-stamp Here's how to skip two automated in a row (configure and build), and instead run the commands by hand. - build: + build: build-stamp + build-stamp: dh build --before configure ./mondoconfig 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. - install: build + 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 before starting a 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. +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: + install: build install-stamp + install-stamp: + dh install --until dh_prep dh_installdocs README TODO dh_installchangelogs Changes dh install --remaining + touch install-stamp binary-arch: install dh_strip -X foo @@ -228,7 +271,6 @@ $sequences{install} = [@{$sequences{build}}, qw{ dh_gconf dh_icons dh_perl - dh_pysupport dh_scrollkeeper dh_usrlocal @@ -250,12 +292,52 @@ $sequences{binary} = [@{$sequences{install}}, qw{ }, @b]; $sequences{'binary-arch'} = [@{$sequences{binary}}]; -# Third-party commands can be listed in the sequences, but should be -# listed here as well. They will not be run if not present. -my %thirdparty=( - dh_pycompat => 1, - dh_pysupport => 1, -); +# --with python-support is enabled by default, at least for now +unshift @{$dh{WITH}}, "python-support"; + +# sequence addon interface +sub _insert { + my $offset=shift; + my $existing=shift; + my $new=shift; + foreach my $sequence (keys %sequences) { + my @list=@{$sequences{$sequence}}; + next unless grep $existing, @list; + my @new; + foreach my $command (@list) { + if ($command eq $existing) { + push @new, $new if $offset < 0; + push @new, $command; + push @new, $new if $offset > 0; + } + else { + push @new, $command; + } + } + $sequences{$sequence}=\@new; + } +} +sub insert_before { + _insert(-1, @_); +} +sub insert_after { + _insert(1, @_); +} +sub remove_command { + my $command=shift; + foreach my $sequence (keys %sequences) { + $sequences{$sequence}=[grep { $_ ne $command } @{$sequences{$sequence}}]; + } + +} +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"); + } +} # Get the sequence of commands to run. if (! @ARGV) { @@ -268,23 +350,33 @@ if (! exists $sequences{$sequence}) { } my @sequence=@{$sequences{$sequence}}; +# The list of all packages that can be acted on. +my @packages=@{$dh{DOPACKAGES}}; + # 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"; + # as an optimisation, remove from the list any packages + # that are not arch dependent + my %arch_packages = map { $_ => 1 } getpackages("arch"); + @packages = grep { $arch_packages{$_} } @packages; } elsif ($sequence eq 'binary-indep') { push @options, "-i"; + # ditto optimisation for arch indep + my %indep_packages = map { $_ => 1 } getpackages("indep"); + @packages = grep { $indep_packages{$_} } @packages; } while (@ARGV_orig) { my $opt=shift @ARGV_orig; next if $opt eq $sequence; - if ($opt =~ /^--?(after|until|before)$/) { + if ($opt =~ /^--?(after|until|before|with)$/) { shift @ARGV_orig; next; } - elsif ($opt =~ /^--?(no-act|remaining|(after|until|before)=)/) { + elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with)=)/) { next; } push @options, $opt; @@ -293,7 +385,7 @@ while (@ARGV_orig) { # Figure out at what point in the sequence to start for each package. my %logged; my %startpoint; -foreach my $package (@{$dh{DOPACKAGES}}) { +foreach my $package (@packages) { my @log=loadlog($package); if ($dh{AFTER}) { # Run commands in the sequence that come after the @@ -340,14 +432,14 @@ elsif ($dh{BEFORE}) { foreach my $i (0..$stoppoint) { # Figure out which packages need to run this command. my @exclude; - foreach my $package (@{$dh{DOPACKAGES}}) { + foreach my $package (@packages) { if ($startpoint{$package} > $i || $logged{$package}{$sequence[$i]}) { push @exclude, $package; } } - if (@exclude eq @{$dh{DOPACKAGES}}) { + if (@exclude eq @packages) { # Command already done for all packages. next; } @@ -366,11 +458,6 @@ sub run { my $command=shift; my @options=@_; - # If a third party command is not in /usr/bin, don't try to run it. - if ($thirdparty{$command} && ! -x "/usr/bin/$command") { - return; - } - # 3 space indent lines the command being run up under the # sequence name after "dh ". print " ".escape_shell($command, @options)."\n";